我在VS 2013中有一个带有母版页的项目。在Root.master中,我有"登录"它将我重定向到登录页面。
<a href="Logare.aspx" runat="server" id="loginLink">Log In</a>
当我登录时,我被重定向到某个页面,让我们说它是Default.aspx。
在Default.aspx.cs中我有:
if (Session["username"] == null)
{
Response.Redirect("Logare.aspx");
}
else
{
loginLink.Text ="Welcome, "+ Session["username"];
}
当我从Root.master登录文本以更改&#34;登录&#34;时,我该怎么办呢?到&#34;欢迎,用户名&#34;?我试图从Root.master获取loginLink id,但在Default.aspx.cs中不知道。
更新
这是&#34;登录&#34;来自Root.master现在:
<a href="Logare.aspx"><asp:Label ID="Label8" runat="server" Text="Log In"></asp:Label></a>
在Default.aspx.cs中我现在有:
if (Session["username"] == null)
{
Response.Redirect("Logare.aspx");
}
else
{
Label mpLabel = new Label();
mpLabel = (Label)Master.FindControl("Label8"); mpLabel.Text = "Welcome, " + Session["username"];
}
但是,有了这个,我收到了错误
对象引用未设置为对象的实例。
在mpLabel.Text = "Welcome, " + Session["username"];
答案 0 :(得分:0)
因此,如果我正确地理解了您的问题,那就是从后面的内容页面代码中访问主页面上声明的控件。您有两种方法可以实现这一目标。
代码很简单(借用OP自己的评论):
Label mpLabel = (Label) Master.FindControl("loginLink");
但请注意,FindControl
仅适用于控件的直接子项。所以如果你的结构看起来像
MasterPage
Control1
Control2
loginLink
你需要这样的东西:
Control c1 = Master.FindControl("Control1");
Control c2 = c1.FindControl("Control2");
Label mpLabel = (Label) c2.FindControl("loginLink");
或者,您可以使用FindControl
的递归版本。它不是开箱即用的,但很多(很多)版本已经在网上。这是one。
在您的母版页代码后面定义一个类似的属性:
public Label LoginLabel
{
get { return this.loginLabel; }
}
在内容页面上使用它。别忘了把大师演绎到你的特定类型:
Label loginLabel = ((YourMasterPageClass)Master).LoginLabel;
这可能不是特别安全,因此您只能公开标签文字:
public Label LoginLabelText
{
get { return this.loginLabel.Text; }
set { this.loginLabel.Text = value; }
}
((YourMasterPageClass)Master).LoginLabelText = "Welcome!";