如何在ASP.NET中从主页面访问内容页控件

16

从内容页访问母版页的控件非常容易,例如:

protected void Page_Load(object sender, EventArgs e)
{
    // content page load event
    DropDownList thisDropDown = this.Master.FindControl("someDropDown") as DropDownList;
    userLabel.Text = thisDropDown.SelectedValue;
}

但是我怎样能够从母版页访问内容页的控件。假设内容页中有一个文本框和母版页中有一个按钮。当我点击母版页按钮时,我想要在母版页的标签中显示内容页文本框的文本。如何实现?请帮我提供代码示例。谢谢。

7个回答

36

在主页面的按钮单击事件中,应通过以下方式访问页面内容:

protected void Button1_Click(object sender, EventArgs e)
{
    TextBox TextBox1 = (TextBox)ContentPlaceHolder1.FindControl("TextBox1");
    if (TextBox1 != null)
    {
        Label1.Text = TextBox1.Text;
    }
}

2
太愚蠢了,需要这么多的代码... 我没有将这归因于您的答案,而是归因于ASP.net模型。 - user3308043
1
闯入派对;不确定“彻底”的评论是针对“错误处理”还是其他什么,但在这种情况下,我建议您实际上不要检查FindControl的结果。如果您没有做任何花哨的事情,很可能您更想得到一个异常来表示错误,而不是默默地什么都不做。更好的方法是:使用断言,并且不要在生产代码中进行检查。如果您仍然设法发布了一个缺少预期控件的项目,请优先将用户重定向到友好的错误页面,并修复您的发布流程。 - tne

3

有一段时间没有联系了,但我相信您可以使用ContentPlaceHolder作为参考来完成此操作:

Control control = this.myContentPlaceHolder.FindControl("ContentPageControlID");

3
在我看来,更好的方法是在主页上使用事件引发,然后在内容页中捕获此事件以更改页面上的某些内容。其主要优点是可重用性。将来,您可能希望从主页更改其他内容页上的内容,在这种情况下,您只需将事件处理程序添加到该内容页,而无需更改主页上的代码。在这种方法中,您不需要硬编码某些内容页的控件名称,而且您甚至不需要添加某些内容的控件依赖关系。
例如,您可以在此处找到实现示例:http://www.codeproject.com/KB/aspnet/MasterContentInteraction.aspx

1
你应该从母版页中查找ContentPlaceHolder,然后在母版页的子级中查找ContentPlaceHolder。
this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("controlAFromPage");

我终于松了一口气……掌握了主页面、woff!还有这么长的查找路径!! - Irf

0

Site.Master 中的 C# 代码:

<div>
  <asp:ContentPlaceHolder ID="MainContent" runat="server">
  </asp:ContentPlaceHolder>
</div>

Site.Master.cs 中的代码:

public partial class SiteMaster : MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {          
        ToolkitScriptManager1.RegisterPostBackControl(this.MainContent.FindControl("btnOnDefaultPage"));            
    }
}

这是一个示例,演示如何从 Site.Master.cs 引用 Default.aspx 上的客户端控件。


欢迎来到 Stack Overflow!请注意您正在回答一个非常古老并且已经有了答案的问题。这里有一份如何回答问题的指南 - help-info.de

0

你可以使用以下代码来查找控件:

ContentPlaceHolder contentPage = Page.MasterPage.FindControl("ContentPlaceHolder1") as ContentPlaceHolder;
Label lblHead =(Label)contentPage.FindControl("lblHeading");
Response.Write(lblHead.Text);

Source: http://xpode.com/ShowArticle.aspx?ArticleId=629


-1

试试这段代码

Page.Master.FindControl("MainContent").FindControl("DivContainer_MyProfile").Visible = True

1
欢迎来到Stack Overflow!我建议您参观一下。在回答问题时最好给出一些解释,说明为什么你的答案是正确的。 - Stephen Rauch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接