如何访问嵌套主页面中的控件?为什么它的行为与内容页面不同?

7

这两个情形有什么区别:

(1) 从一个普通的子页面中访问母版页上的属性。

(2) 从一个嵌套的母版页中访问母版页上的属性。

我试图像这样从内容页中访问母版页中的文本框:

TextBox a;
a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive
defaultTextbox.Text = a.Text; // defaultTextBox is a textbox control inside default.aspx

这个方法可以工作,但是当我在一个嵌套的母版页上应用相同的方法时:

TextBox a;
a = (TextBox)Master.FindControl("ayyash"); // Master is declared in MasterType directive
myTextBox.Text = a.Text; // myTextBox is a textbox control inside child.master

这个不起作用,我有什么遗漏吗?我在普通的page_load处理程序中调用了两个代码...

我还注意到我无法从后台代码设置嵌套主页面中的文本框值,肯定有些东西我没有理解,是什么呢? 为了阐明这个问题,这里举个例子:

嵌套主页面:

<%@ Master Language="C#" MasterPageFile="MasterPage.master" AutoEventWireup="false" CodeFile="MasterPage2.master.cs" Inherits="MasterPage2" %>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

<asp:textbox id="tx2" runat="server" text="this is two"></asp:textbox>
<asp:contentplaceholder id="newstuff" runat="server"></asp:contentplaceholder>
</asp:Content>

代码后台:

Response.Wrote(tx2.Text);

我什么都没有得到,为什么?我错过了什么吗?请注意,我还尝试了递归查找控件:
String str = ((TextBox)((Content)FindControl("Content2")).FindControl("tx2")).Text;

仍然没有任何东西

4个回答

5
ContentPlaceHolder cp = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
  //base content place holder id

Label objLabel3 = (Label)cp.FindControl("lblNested");
  //lblNested is id in nested master page

4
我在这里读了一些内容:http://www.odetocode.com/Articles/450.aspx,发现中间的嵌套页面从未调用Page_Load!相反,它会触发一个load事件,您可以捕获该事件来设置任何字段,因此答案是:在嵌套页面上执行以下操作:
protected override void OnLoad(EventArgs e)
    {
        myTextBox.Text = "anything";
        base.OnLoad(e);
    }

如果嵌套的母版页没有调用Page_Load方法,那么其他方面也可能存在问题,因为所有的Page_Load方法都应该被调用(在母版页、嵌套的母版页和内容页上)。我在原来的答案中添加了一些更多的信息。 - Ronald Wildenberg

2
这应该没有问题,所以其他地方一定有问题。我刚在一个简单的测试项目中尝试了一下,在两种情况下都没有问题找到主页面上的控件。
我建议您再次检查嵌套主页面中是否引用了正确的主页面。您还可以检查嵌套主页面中Master属性的运行时类型。它应该是您主页面的类型。
编辑:我以为问题是从嵌套主页面中查找根主页面中的控件,这应该没有问题。如果要在嵌套主页面的内容占位符中查找控件,请参阅以下论坛帖子

我刚刚从头开始创建了一个新项目,但结果却没有改变!我无法访问嵌套页面中间的任何内容。 - Ayyash
我认为你的问题是关于如何从嵌套的主控页和内容页访问根主控页上的属性。我会尝试看看能否让另一个场景起作用:从内容页访问嵌套主控页上的属性。 - Ronald Wildenberg

0

使用指令,您可以在内容页中同时控制母版页和嵌套页的内容,实现绝对控制:

<%@ MasterType VirtualPath="your_master.master" %>
<%@ Reference VirtualPath="~/your_master.master" %>

请查看K. Scott Allen在Ode To Code上的优秀文章。


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