【问题标题】:how to access master page control from content page如何从内容页面访问母版页控件
【发布时间】:2020-01-14 14:13:21
【问题描述】:

我有一个包含状态消息标签的母版页。我需要从不同的 .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!");
                }                                       
            }
        }
    }                   
}

【问题讨论】:

  • 所以你想访问你所有aspx页面中的label's text property....对吗?
  • 是的,这基本上就是我想要实现的目标......
  • @LeonidasFett:应该可以,那你有什么问题?你用过调试器吗?
  • 我收到一个错误,即对于 var 命名空间不可用,即使当我在方法中使用它时它也有效。它告诉我 Master 没有对象引用...
  • 啊,不能这样初始化字段。使用Page_Init 对其进行初始化。

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


【解决方案1】:

如果您尝试访问一个 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;

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

【讨论】:

    【解决方案2】:

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

    关键位:Master.Master

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

    例子:

    '查找内容控件

    Dim ct As ContentPlaceHolder = Me.Master.Master.FindControl("cphMain")

    '现在在该内容中找到控件

    Dim lbtnSave As LinkBut​​ton = ct.FindControl("lbtnSave")

    【讨论】:

      【解决方案3】:

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

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

      在您的 aspx 页面上,就在页面指令下方添加以下内容:

      <%@ 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";
      

      【讨论】:

      • 将此问题的标题更改为更相关的标题。 '如何从内容页面访问母版页控件'
      • 好的,现在我在属性字段中得到了一个 NullReferenceException 的标签...我在上面上传了我的新代码。我错过了什么吗?
      • 好像你错过了蒂姆在下面提到的初始化部分。
      • 嗨亲爱的朋友,这在更新面板上不起作用,我如何通过更新面板运行它
      • 您需要在您的 updatePanel 上调用 Update 方法。如果您想将更改从后面的代码直接推送到更新面板。对我有用。
      【解决方案4】:

      有效

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

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

      【讨论】:

        【解决方案5】:

        我的 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";
        

        【讨论】:

          【解决方案6】:

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

          这里的“lblStatus”是您的母版页标签 ID

          标签 lblMasterStatus = (Label)Master.FindControl("lblStatus"); lblMasterStatus.Text = "来自内容页面的测量";

          【讨论】:

          • 如果主人有主人,你必须Master.Master
          【解决方案7】:

          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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-20
            • 2010-09-27
            • 2011-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多