从后面的子母版页代码访问子母版页上的用户控件

Posted

技术标签:

【中文标题】从后面的子母版页代码访问子母版页上的用户控件【英文标题】:Accessing user control on child master page from child master page code behind 【发布时间】:2010-11-25 07:13:27 【问题描述】:

尝试通过同一母版页后面的代码在我的子母版页上设置文字用户控件的值。

这是我正在使用的代码示例:

Global.master

<form id="form1" runat="server">
<div>
    <asp:ContentPlaceHolder id="GlobalContentPlaceHolderBody" runat="server">

    </asp:ContentPlaceHolder>
</div>
</form>

Template.master(Global.master 的子级)

<asp:Content ID="TemplateContentBody" ContentPlaceHolderID="GlobalContentPlaceHolderBody" Runat="Server">
<asp:Literal ID="MyLiteral1" runat="Server"></asp:Literal>

<p>This is template sample content!</p>
  <asp:ContentPlaceHolder ID="TemplateContentPlaceHolderBody" runat="server">

</asp:ContentPlaceHolder>

Template.master.cs

    protected void Page_Load(object sender, EventArgs e)

    MyLiteral1.Text = "Test";

ContentPage.aspx

< asp:Content ID="ContentBody" ContentPlaceHolderID="TemplateContentPlaceHolderBody" Runat="Server">
</asp:Content>

一旦我能够做到这一点,我还需要能够通过内容页面访问全局和模板母版页上的内容。

【问题讨论】:

我没有看到任何错误,但文字没有更新。 这可能看起来很傻,但是您是在创建一个网站,还是一个 Web 应用程序?如果是后者,你不是已经编译了你的网站了吗? 只是一个网站...不是编译问题。谢谢 【参考方案1】:

如果我了解您的情况,您希望您的内容页面访问母版页面中的项目。如果是这样,您需要设置一个属性以从您的母版页中公开它们,并且在您的内容页中您可以设置一个 MasterType 指令。

以this post 为例。

【讨论】:

您的标题与您的最后一句话有点冲突,“......我还需要能够访问内容......通过内容页面。”我提出的答案涵盖了这种情况,除非您尝试从母版页执行某些操作。 +1 如果我们谈论的是访问父母版页上的控件,那么我们正在寻找 MasterType 指令。 艾哈迈德,我试图通过它自己的代码访问嵌套子母版页上的控件。解决方法是在 OnLoad 事件中调用它。 Alexis - MasterType 指令对于通过内容页面访问很有用,而不是从嵌套母版页面本身访问。【参考方案2】:

找到一个可行的解决方案。在template.master(嵌套子master)中,我不得不把代码放在OnLoad事件中。

protected override void OnLoad(EventArgs e)

    MyLiteral1.Text= "<p>MyLiteral1 Successfully updated from nested template!</p>";
    base.OnLoad(e);

很奇怪……

基本上,我使用全局母版作为在每个页面上共享代码的页面,然后我将有各种嵌套页面以适应每个网站部分。对于导航嵌套模板,我希望能够显示用户是否登录以及购物车中有多少商品。

如果有更好的方法来实现这一点,我愿意接受建议。

【讨论】:

这就是这样做的方法。奇怪的是,这在 Page_Load 中不起作用。【参考方案3】:

编辑:当我认为您试图从后面的父主代码访问子主控上的控件时,这是我的回答。

您可以使用递归 findControl 函数:

protected Control FindControlRecursive(string id, Control parent)

    // If parent is the control we're looking for, return it
    if (string.Compare(parent.ID, id, true) == 0)
        return parent;

    // Search through children
    foreach (Control child in parent.Controls)
    
        Control match = FindControlRecursive(id, child);

        if (match != null)
            return match;
    

    // If we reach here then no control with id was found
    return null;

然后在您的母版页中使用此代码:

protected void Page_Load(object sender, EventArgs e)

//EDIT: if GlobalContentPlaceHolderBody isn't visible here, use this instead:
//Control c = FindControlRecursive("MyLiteral1", Page.FindControl("GlobalContentPlaceHolderBody"));
    Control c = FindControlRecursive("MyLiteral1", GlobalContentPlaceHolderBody);
    if(c != null)
        ((Literal)c).Text = "Test";

【讨论】:

我应该把受保护的控件 FindControlRecursive 放在哪里?如果我将它添加到 Template.master.cs,我会收到错误:当前上下文中不存在名称“GlobalContentPlaceHolderBody”。 通过内容页面访问主控中的用户控件,很简单。在 template.master.cs 中添加了以下内容: public string ContentLabelDemoPublic set ContentLabelDemo.Text = value;然后在内容页面中我可以添加: ((MasterPages_Template)Master).ContentLabelDemoPublic = "使用由内容页面更新的公共变量公开的子母版页上的标签";通过自己的代码隐藏访问嵌套母版页应该没有那么困难。 GlobalContentPlaceHolderBody 是您的容器的 ID。如果这对您的代码不可见,您可以使用 Page.FindControl("GlobalContentPlaceHolderBody"); 您需要将 FindControlRecursive 添加到母版页。 这比子访问主控上的控件更复杂的原因是母版页始终存在。但不能保证子控件始终存在。

以上是关于从后面的子母版页代码访问子母版页上的用户控件的主要内容,如果未能解决你的问题,请参考以下文章

母版页子母版页页面之间的关系

从内容页面设置母版页上的属性值

asp.net 如何从具有嵌套母版页的内容页更改父母版页中的控件

前端页面的布局

无法从Javascript访问Master页面上的用户控件中的标签

从内容页面访问母版页控件(html:输入)不起作用