我有一个www.example.com webforms项目,其中包含一个由我的内容页引用的Site.master页。标题为:asp.net webforms project with a Site.Master page that's ref'd by my content pages. The header is: <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="JT1.SiteMaster" %>
....
它包括一个带有几个按钮的导航栏和一个位于右侧的标签,如下所示:
<li><a runat="server" href="~/About">About</a></li>
<li><a runat="server" href="~/Contact">Contact</a></li>
<li><a runat="server" href="~/Login">Log In | Sign Up</a></li>
<li><p runat="server" class="navbar-text navbar-right">
<label runat="server" id="LoggedInUserID" >Logged Off</label>
</p></li>
所有按钮都显示出来并正常工作,默认情况下,文本"Logged Off"出现在所有使用主页的页面上。在Login.aspx.cs中,我想将"LoggedInUserID"标签的文本更改为适当的内容,如"Welcome,Jim"。以下代码是我能想到的最好的代码:
HtmlControl ctl = Master.FindControl("LoggedInUserID") as HtmlControl;
if (ctl != null) ctl.Attributes["InnerText"] = "Welcome " + firstname;
这实际上找到了正确的控件,我可以在调试器中看到它的InnerText实际上是"Logged Off"。但是我对它的赋值不起作用。没有异常,没有错误,什么都没有。我仔细阅读了许多其他类似的问题,没有看到任何我没有尝试过的问题。有人有什么想法吗?
1条答案
按热度按时间az31mfrm1#
首先加载子页面,然后加载父(主)页面。
因此,您的代码(如果在子页上)将运行,但随后母版页加载,您的设置丢失。
但是,假设我们将代码(甚至是测试按钮)移到了母版页。
当你点击那个按钮,子页面加载,主页面加载,你的按钮代码运行,标签设置。
但是,如果单击另一个菜单栏项,会发生什么情况?
原来母版页又加载了。你可以把这想象成你导航到一个页面,然后导航回那个页面。
因此,即使您在母版页中放置一个按钮+代码来“更改”标签?好吧,这至少会起作用+显示更改,因为母版页在子页之后运行。
然而,只要你“停留”在一个主页面+子页面上,这个控件现在就只会存在。
如果页面上有一个按钮,设置标签或文本框,这将没有什么不同。这样的页面可以在回发后继续存在,没有问题。(控件具有runat=server的自动视图状态)
然而,如果我们导航到一个新页面,然后导航回来(不使用后退按钮),那么标签设置将丢失(这是你必须考虑的主页)。
那么,现在我们“固定”了上面的设置?
现在,我们必须考虑是否点击了一个新的菜单栏选项,然后导航到一个全新的主/子页面。
在此导航中,母版页将从头重新加载。因此,您必须再次重新运行该代码。
长话短说?
您需要将该代码移到母版页的页面加载事件中。
我的意思是,当你想修改/改变/更新/显示/看到主菜单栏的变化时,一个真正的“整洁”的克鲁格?
你可以执行(在子页面中,改变菜单“设置”-注意我说的菜单设置,因为我们仍然在理论上必须改变主页面中的mnu栏。所以,在这种情况下,我们可能已经改变了一些设置-但它必须是会话类型的交易)。现在,如何“看到”这个更新的状态/在导航栏中的变化?你可以这样做:
这当然会“强制”菜单栏刷新。(有点像点击一个不同的菜单栏选项,然后点击我们正在使用的那个)。
但是,如前所述,只有当母版页加载事件“更改”了它最初所做的事情时,它才会看到这种强制更改。
(因为使用runat=server,您可以获得该控件视图状态)。
然而,当你点击另一个菜单项时,你必须“考虑”这是一个全新的导航到那个页面。