内容页面可以使用其主页的主父级的ContentPlaceHolderID(嵌套母版页)

时间:2010-09-29 18:07:16

标签: asp.net master-pages nested

我有3级嵌套母版页和内容页。 parent1是顶级父级,parent2是parent3的父级,parent3是内容页面的父级。

我收到错误“Cannot find ContentPlaceHolder xxx...”,其中xxx是ContentPlaceholder。它位于parent2中,内容页面正在尝试填充它。

内容页面只能使用他们的直接父ContentPlaceHolders,还能使用任何更高版本的主页?

3 个答案:

答案 0 :(得分: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中的默认值。)可能有一种方法可以通过编程方式执行此操作,但“开箱即用”这似乎可以让你做你所问的,如果你能忍受这个警告。

祝你好运!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

获取母版页上的控件值 在运行时,母版页与内容页合并,因此母版页上的控件可供内容页代码访问。 (如果母版页包含ContentPlaceHolder控件中的控件,则如果内容页面中的内容控件覆盖了这些控件,则无法访问这些控件。)控件不能作为母版页成员直接访问,因为它们受到保护。但是,您可以使用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

由于您要查找嵌套内容占位符,您可能必须找到父级,然后使用该实例查找子级