如何从内容页面访问母版页控件

时间:2013-03-22 14:59:49

标签: asp.net master-pages code-behind

我有一个母版页,其中包含状态消息的标签。我需要从不同的.aspx页面设置状态文本。如何从内容页面完成?

public partial class Site : System.Web.UI.MasterPage
{
    public string StatusNachricht
    {
        get
        {
            return lblStatus.Text;
        }
        set
        {
            lblStatus.Text = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {            

    }
}

我试过这个,但是没有成功使它工作:

public partial class DatenAendern : System.Web.UI.Page
{
    var master = Master as Site;

    protected void Page_Load(object sender, EventArgs e)
    {               
        if (master != null)
        {
            master.setStatusLabel("");
        }
    }        

    protected void grdBenutzer_RowCommand(object sender, GridViewCommandEventArgs e)
    {           
            try
            {
                //some code

                if (master != null)
                {
                    master.setStatusLabel("Passwort erfolgreich geändert.");
                }
            }
            catch (Exception ex)
            {
                if (master != null)
                {
                    master.setStatusLabel("Passwort konnte nicht geändert werden!");
                }                                       
            }
        }
    }                   
}

7 个答案:

答案 0 :(得分:72)

在MasterPage.cs文件中添加property Label,如下所示:

public string ErrorMessage
{
    get
    {
        return lblMessage.Text;
    }
    set
    {
        lblMessage.Text = value;
    }
}

aspx页面上,在Page Directive下面添加:

<%@ Page Title="" Language="C#" MasterPageFile="Master Path Name"..... %>
<%@ MasterType VirtualPath="Master Path Name" %>   // Add this

然后,在您的codebehind(aspx.cs)页面中,您可以轻松访问Label Property并根据需要设置其text。像这样:

this.Master.ErrorMessage = "Your Error Message here";

答案 1 :(得分:29)

在“内容”页面中,您可以访问标签并设置文本,例如

此处'lblStatus'是您的母版页标签ID

Label lblMasterStatus = (Label)Master.FindControl("lblStatus");

lblMasterStatus.Text  = "Meaasage from content page";

答案 2 :(得分:8)

工作

在子页面上查找母版页控件

Label lbl_UserName = this.Master.FindControl("lbl_UserName") as Label;                    
lbl_UserName.Text = txtUsr.Text;

答案 3 :(得分:4)

我的System.Web.UI.Page类

中有一个帮助方法
protected T FindControlFromMaster<T>(string name) where T : Control
{
     MasterPage master = this.Master;
     while (master != null)
     {
         T control = master.FindControl(name) as T;
         if (control != null)
             return control;

         master = master.Master;
     }
     return null;
}

然后您可以使用以下代码进行访问。

Label lblStatus = FindControlFromMaster<Label>("lblStatus");
if(lblStatus!=null) 
    lblStatus.Text = "something";

答案 4 :(得分:3)

cannot use var in a field,仅限于本地变量。

但即使这样也行不通:

Site master = Master as Site;

由于您无法在字段中使用this,因此Master as Sitethis.Master as Site相同。因此,只需在页面完全初始化后从Page_Init初始化该字段,您就可以使用this

Site master = null;

protected void Page_Init(object sender, EventArgs e)
{            
    master = this.Master as Site;
}

答案 5 :(得分:1)

如果您有嵌套的MasterPage,这会更复杂。您需要首先找到包含嵌套MasterPage的内容控件,然后从中找到嵌套MasterPage上的控件。

关键位: Master.Master

见这里:http://forums.asp.net/t/1059255.aspx?Nested+master+pages+and+Master+FindControl

示例:

  

&#39;找到内容控件

     

Dim ct As ContentPlaceHolder = Me.Master.Master.FindControl(&#34; cphMain&#34;)

     

&#39;现在在内容中找到控件

     

Dim lbtnSave As LinkBut​​ton = ct.FindControl(&#34; lbtnSave&#34;)

答案 6 :(得分:0)

如果您尝试访问html元素:这是HTML锚...

我的导航栏中的项目不是列表项(<li>),而是html锚点(<a>

请参见下文:(这是网站管理员)

<nav class="mdl-navigation">
    <a class="mdl-navigation__link" href="" runat="server" id="liHome">Home</a>
    <a class="mdl-navigation__link" href="" runat="server" id="liDashboard">Dashboard</a>
</nav>

现在在您的代码后面添加另一个页面,对于我来说,这是登录页面...

在PageLoad()上定义以下内容:

HtmlAnchor lblMasterStatus = (HtmlAnchor)Master.FindControl("liHome");
lblMasterStatus.Visible =false;

HtmlAnchor lblMasterStatus1 = (HtmlAnchor)Master.FindControl("liDashboard");
lblMasterStatus1.Visible = false;

现在,我们已经访问了站点主控件,并使它们在登录页面上不可见。