您应该将这个问题命名为“如何在ContentPlaceholder 中找到控件?”,因为您的问题不是PreviousPage 不起作用,而是您不明白ContentPlaceholders 是如何工作的工作。
这个问题与母版页本身无关,完全与使用ContentPlaceholder 相关,ContentPlaceholder 是 asp.net 用语中的命名容器。 FindControls 不在命名容器内搜索,这正是它们的设计方式。
PreviousPage 与母版页配合良好,因此我对它们与您的问题有什么关系感到困惑。您可以访问上一页上您想要的任何属性,它实际上会起作用。例如:
HtmlForm form = PreviousPage.Form; // this works fine
Control ctrl = PreviousPage.Master.FindControl("TextBox1"); // this works as well
您可能遇到的问题是您尝试使用 FindControl() 在内容页面中查找特定控件,但它不起作用,正是因为您在 PreviousPage 上调用 FindControl,而不是在您要查找的控件所在的命名容器。
要找到您想要的控件,您只需在命名容器上执行FindControl。以下代码可以正常工作,假设占位符名为 ContentPlaceHolder1。
var ph = PreviousPage.Controls[0].FindControl("ContentPlaceHolder1");
var ctl = ph.FindControl("TextBox1");
您可以使用以下代码验证此问题与PreviousPage 无关,该代码仅使用单个页面并在自身上查找控件。在 Default.aspx 页面上放置一个名为 TextBox1 的文本框。然后,在Default.aspx.cs后面代码的Page_Load函数中放入这段代码,然后在调试器中运行并单步执行。
protected void Page_Load(object sender, EventArgs e)
{
// Following code should find the control, right? Wrong. It's null
var ctrl = Page.FindControl("TextBox1");
// assuming your content placeholder in the masterpage is called MainContent, this works.
var ctrl = Page.Controls[0].FindControl("MainContent").FindControl("TextBox1");
}
所以,请不要说“如果页面有母版页,PreviousPage 将无法正常工作”,因为它完全可以正常工作。问题是你不知道它应该如何工作。了解页面对象模型的工作原理。