内容页是否可以使用其母版页的主母版页(嵌套母版页)的ContentPlaceHolderID?

3

我有一个三级嵌套的主页面和一个内容页。parent1是顶级父级,parent2是parent3的父级,parent3是内容页的父级。

我收到一个错误信息 '无法找到ContentPlaceHolder xxx...',其中xxx是ContentPlaceholder。它位于parent2中,而内容页正在尝试填充它。

内容页只能使用其直接父级ContentPlaceHolders吗?还是也可以使用任何更高的主页面?


你可以导航到任何级别的父级,我不认为有任何限制。你能否发布你的代码? - Vinay B R
你解决过这个问题吗?我也遇到了同样的问题。 - Terry
3个回答

1

有一种方法可以做到这一点,但在某些情况下,如果您依赖于占位符的任何默认内容,则会出现轻微问题。

在您的示例中,您有Parent1.master

<div id="content">
    <h1>Lorem Ipsum, from Parent1</h1>
    <asp:ContentPlaceHolder ID="cphContent" runat="server">
        <p>I am default content from Parent1...</p>
    </asp:ContentPlaceHolder>
</div>

你还有一个嵌套的Parent2.master,它使用了来自Parent1的占位符:

<asp:Content ContentPlaceHolderID="cphContent" runat="server">
    <h2>I am some specific stuff from Parent2...</h2>
    <asp:ContentPlaceHolder ID="cphContent" runat="server">
        <p>I am default content from within Parent2!</p>
        <p>We want to create another, nested CPH so that Parent3 can use it!</p>
        <p>(It is seemingly OK that we can use the same ID for this CPH<br />
            in Parent2 that we did originally in Parent1.)</p>
    </asp:ContentPlaceHolder>   
</asp:Content>

现在Parent3.master可以使用来自Parent2的占位符。(并且还提供另一个占位符供最终内容页面使用!) 这是它:

<asp:Content ContentPlaceHolderID="cphContent" runat="server">
    <h3>Hello from Parent3!</h3>
    <asp:ContentPlaceHolder ID="cphContent" runat="server">
        <p>I am more default text in yet another nested placeholder</p>
    </asp:ContentPlaceHolder>   
</asp:Content>

你的渲染内容页面将会长成这个样子:

<div id="content">
    <h1>Lorem Ipsum, from Parent1</h1>
    <h2>I am some specific stuff from Parent2...</h2>
    <h3>Hello from Parent3!</h3>
    <p>I am the plugged-in content, from the content page!</p>
</div>

这种方法的一个很酷的地方,也是为什么我们可能想在整个继承链中使用相同的名称来命名这些嵌套的CPH,因为你最终的内容页面可以从使用任何一种父母主控制页面1到3而无需改变其他任何东西,只要它们期望找到称为cphContent的东西来消耗。

好的,现在您已经看到了有趣的部分,但我提到的唯一可能成为问题的事情是,如果您试图让任何“默认”文本流传到任何子代之一。我指的是,如果您的内容页面不为“cphContent”占位符提供任何内容,则只会使用最后一个主控页面的默认值。从Parent1.master的默认值在Parent2之后就被丢失了。(虽然您当然可以使用Parent3的默认值。)也许有一种以编程方式实现这一点的方法,但“开箱即用”似乎允许您做您所要求的事情,如果您能接受这个警告。

祝你好运!


0

我相信内容页面只能使用直接父级的ContentPlaceHolder。


0
获取主页面控件的值
在运行时,主页面与内容页面合并,因此主页面上的控件可以被内容页面代码访问。(如果主页面包含ContentPlaceHolder控件中的控件,并且这些控件被内容页面的Content控件覆盖,则这些控件不可访问。)这些控件不能直接作为主页面成员访问,因为它们是受保护的。但是,您可以使用FindControl方法来定位主页面上的特定控件。如果您要访问的控件在主页面上的ContentPlaceHolder控件内,您必须先获得对ContentPlaceHolder控件的引用,然后调用其FindControl方法以获取对控件的引用。
以下示例显示了如何获取对主页面上控件的引用。其中一个被引用的控件位于ContentPlaceHolder控件中,而另一个则不是。
Visual Basic复制代码 '获取ContentPlaceHolder内的TextBox控件的引用
Dim mpContentPlaceHolder As ContentPlaceHolder
Dim mpTextBox As TextBox
mpContentPlaceHolder = _
    CType(Master.FindControl("ContentPlaceHolder1"), _
    ContentPlaceHolder)
If Not mpContentPlaceHolder Is Nothing Then
    mpTextBox = CType(mpContentPlaceHolder.FindControl("TextBox1"), _
        TextBox)
    If Not mpTextBox Is Nothing Then
        mpTextBox.Text = "TextBox found!"
    End If

如果你想找到一个嵌套的内容占位符,你可能需要先找到父级,然后使用该实例来查找子级。


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