Kamil Karliński

Kamil Karliński Nie kolekcjonuję
znajomych

Temat: Problem z kontrolka w CodeBehind

Witam. Jestem początkujący w ASP.NET. Stworzyłam sobie nowy projekt formularzy sieci web (Web Dev 2012 Express). W pliku Site.Master chciałbym przy nazwie zalogowanego użytkownika dodać jakiś tekst. Wstawiłem na stronie Label ale nie mogę się do niego dostać z CodeBehind - a tu chciałbym dokonać ustawienia w zdarzeniu Page_Load.


<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.Master.cs" Inherits="Test.SiteMaster" %>
...
<asp:LoginView runat="server" ViewStateMode="Disabled">
<AnonymousTemplate>
<ul>
<li><a id="registerLink" runat="server" href="~/Account/Register">Register</a></li>
<li><a id="loginLink" runat="server" href="~/Account/Login">Log in</a></li>
</ul>
</AnonymousTemplate>
<LoggedInTemplate>
<p>
Hello, <a runat="server" class="username" href="~/Account/Manage" title="Manage your account">
<asp:LoginName ID="loginName1" runat="server" CssClass="username" />
<asp:Label ID="lblTime" CssClass="username" runat="server" Text=""></asp:Label>
</a>
<asp:LoginStatus runat="server" LogoutAction="Redirect" LogoutText="Log off" LogoutPageUrl="~/" />
</p>
</LoggedInTemplate>
</asp:LoginView>



namespace Test
{
public partial class SiteMaster : MasterPage
...
protected void Page_Load(object sender, EventArgs e)
{

lblTime.Text = "Test";

}

Dostaje błąd: Nazwa „lblTime” nie istnieje w bieżącym kontekście. Co mogłem zrobić źle?

konto usunięte

Temat: Problem z kontrolka w CodeBehind

Według mnie problem jest tutaj ->

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.Master.cs"

zmień na ->

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="SiteMaster.cs"

SiteMaster.cs bez kropki. W atrybucie CodeBehind musisz podać nazwę pliku w jakiej przechowujesz kod - czy plik nazywa się "SiteMaster.cs" czy "Site.Master.cs"?? Zauważ, że nazwa Twojej klasy to "SiteMaster", a nie "Site.Master".

Na tej samej zasadzie nie powinieneś mieć dostępu do kontrolki -> loginName1 .Bartosz Siemasz edytował(a) ten post dnia 25.03.13 o godzinie 22:22
Kamil Karliński

Kamil Karliński Nie kolekcjonuję
znajomych

Temat: Problem z kontrolka w CodeBehind

Dzięki za odpowiedz ale to chyba nie tu lezy problem. Plik nazywa się Site.Master.cs, to taka dziwna konstrukcja, ale to generator template’u aplikacji Web (ten w WD 2012 - taki rozbudowany co robi podstrony do autentykacji Forms) tak to wygenerował że inna nazwa jest klasy a inna pliku ją zawierającego – niby nic w tym złego ale mało intuicyjnie. Tak wiec plik wzorca nazywa się Site.Master a jego plik CodeBehind oczywiście ma jeszcze .cs (dodatkowo plik designera Site.Master.designer.cs). Sama klasa faktycznie nazywa się SiteMaster i dziedziczy z MasterPage. Tu wydaje mi się wszystko ok. Przesyłam cały kod:

Site.Master.cs:

namespace Test
{
public partial class SiteMaster : MasterPage
{
private const string AntiXsrfTokenKey = "__AntiXsrfToken";
private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
private string _antiXsrfTokenValue;

protected void Page_Init(object sender, EventArgs e)
{
// The code below helps to protect against XSRF attacks
var requestCookie = Request.Cookies[AntiXsrfTokenKey];
Guid requestCookieGuidValue;
if (requestCookie != null && Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
{
// Use the Anti-XSRF token from the cookie
_antiXsrfTokenValue = requestCookie.Value;
Page.ViewStateUserKey = _antiXsrfTokenValue;
}
else
{
// Generate a new Anti-XSRF token and save to the cookie
_antiXsrfTokenValue = Guid.NewGuid().ToString("N");
Page.ViewStateUserKey = _antiXsrfTokenValue;

var responseCookie = new HttpCookie(AntiXsrfTokenKey)
{
HttpOnly = true,
Value = _antiXsrfTokenValue
};
if (FormsAuthentication.RequireSSL && Request.IsSecureConnection)
{
responseCookie.Secure = true;
}
Response.Cookies.Set(responseCookie);
}

Page.PreLoad += master_Page_PreLoad;
}

protected void master_Page_PreLoad(object sender, EventArgs e)
{
if (!IsPostBack)
{
// Set Anti-XSRF token
ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;
ViewState[AntiXsrfUserNameKey] = Context.User.Identity.Name ?? String.Empty;

}
else
{
// Validate the Anti-XSRF token
if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue
|| (string)ViewState[AntiXsrfUserNameKey] != (Context.User.Identity.Name ?? String.Empty))
{
throw new InvalidOperationException("Validation of Anti-XSRF token failed.");
}
}
}



protected void Page_Load(object sender, EventArgs e)
{
//-------------------------!!!!!!!!!!!!!!!!!!!!!!!!!1----------------
//tylko to ja dodałem
//--------------------------------------------------------------
lblTime.Text = "Test";

}


Site.Master

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.Master.cs" Inherits="Test.SiteMaster" %>

<!DOCTYPE html>
<html lang="en">
<head runat="server">
<meta charset="utf-8" />
<title><%: Page.Title %> - My ASP.NET Application</title>
<asp:PlaceHolder runat="server">
<%: Scripts.Render("~/bundles/modernizr") %>
</asp:PlaceHolder>
<webopt:BundleReference runat="server" Path="~/Content/css" />
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width" />
<asp:ContentPlaceHolder runat="server" ID="HeadContent" />
</head>
<body>
<form runat="server">
<asp:ScriptManager runat="server">
<Scripts>
<%--To learn more about bundling scripts in ScriptManager see http://go.microsoft.com/fwlink/?LinkID=272931&clcid=0x409 --%>
<%--Framework Scripts--%>

<asp:ScriptReference Name="MsAjaxBundle" />
<asp:ScriptReference Name="jquery" />
<asp:ScriptReference Name="jquery.ui.combined" />
<asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
<asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
<asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
<asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
<asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
<asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
<asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
<asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
<asp:ScriptReference Name="WebFormsBundle" />
<%--Site Scripts--%>

</Scripts>
</asp:ScriptManager>
<header>
<div class="content-wrapper">
<div class="float-left">
<p class="site-title">
<a runat="server" href="~/">your logo here</a>
</p>
</div>
<div class="float-right">
<section id="login">
<asp:LoginView runat="server" ViewStateMode="Disabled">
<AnonymousTemplate>
<ul>
<li><a id="registerLink" runat="server" href="~/Account/Register">Register</a></li>
<li><a id="loginLink" runat="server" href="~/Account/Login">Log in</a></li>
</ul>
</AnonymousTemplate>
<LoggedInTemplate>
<p>
Hello, <a runat="server" class="username" href="~/Account/Manage" title="Manage your account">
<asp:LoginName ID="loginName1" runat="server" CssClass="username" />
<asp:Label ID="lblTime" CssClass="username" runat="server" Text=""></asp:Label>
</a>
<asp:LoginStatus runat="server" LogoutAction="Redirect" LogoutText="Log off" LogoutPageUrl="~/" />
</p>
</LoggedInTemplate>
</asp:LoginView>
</section>
<nav>
<ul id="menu">
<li><a runat="server" href="~/">Home</a></li>
<li><a runat="server" href="~/About">About</a></li>
<li><a runat="server" href="~/Contact">Contact</a></li>
</ul>
</nav>
</div>
</div>
</header>
<div id="body">
<asp:ContentPlaceHolder runat="server" ID="FeaturedContent" />
<section class="content-wrapper main-content clear-fix">
<asp:ContentPlaceHolder runat="server" ID="MainContent" />
</section>
</div>
<footer>
<div class="content-wrapper">
<div class="float-left">
<p>© <%: DateTime.Now.Year %> - My ASP.NET Application</p>
</div>
</div>
</footer>
</form>
</body>
</html>


Jeżeli usunę kropkę w nazwie to mi nie znajdzie pliku. A z nazwy pliku nie mogę usunąć bo nie będzie rozszerzenia. Do innych kontrolek też nie mam dostępu na tej samej zasadzie.
Czy w ogóle w tronie wzorcowej można się do nich odwoływać w CodeBehind? Może są jakieś ograniczenia??
Wcześniej zajmowałem się tylko desktopowymi app.
Pozdrawiam.

konto usunięte

Temat: Problem z kontrolka w CodeBehind

A jaki masz typ projektu? Web Site czy Web Application? Pytam, bo o ile się orientuję MS zaleca korzystanie z Web Application, a Web Site trzyma dla wstecznej kompatybilności.

Jeszcze jeden hint. Otwórz okienko Solution Explorer, prawoklik na projekcie i naciśnij "Convert to application". To wygeneruje pliki takie jak designer.cs. Zastanawiam się czy po tej operacji będziesz już widział w codebihind swoje kontrolki.Bartosz Siemasz edytował(a) ten post dnia 26.03.13 o godzinie 02:01

Temat: Problem z kontrolka w CodeBehind

Problem polega na tym, że wstawiłeś Label w kontrolkę LoginView, dlatego nie widzisz jej bezpośrednio w kodzie. Możesz się do niej dobrać tak:

if (Request.IsAuthenticated)
{
Label lblTime = (Label)LoginView1.FindControl("lblTime");
lblTime.Text = "testowy";
}

Tylko, że musisz dla LoginView nadać ID. Linia ma wyglądać tak:

<asp:LoginView ID="LoginView1" runat="server" ViewStateMode="Disabled">

Trzeba zastosować if dlatego, że LoginView ma 2 szablony w zależności czy jesteś zalogowany czy nie. Twój tekst będzie widoczny po zalogowaniu.Sebastian Olszewski edytował(a) ten post dnia 26.03.13 o godzinie 10:37

konto usunięte

Temat: Problem z kontrolka w CodeBehind

Myślę, że kolega nade mną ma rację. Też bym tak się do tego zabrał.
Kamil Karliński

Kamil Karliński Nie kolekcjonuję
znajomych

Temat: Problem z kontrolka w CodeBehind

Sukces. Bardzo dziękuję za pomoc.

Następna dyskusja:

problem z target="_parent"




Wyślij zaproszenie do