2010-09-29 152 views
3

我有一个3级嵌套母版页面和一个内容页面。 parent1是顶级父级,parent2是parent3的父级,parent3是内容页面的父级。内容页面是否可以使用其母版页面的母版父母的主ContentPoltageHolderID(嵌套母版页)

我收到一个错误'Cannot find ContentPlaceHolder xxx...',其中xxx是一个ContentPlaceholder。它驻留在parent2中,内容页面正在尝试填充它。

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

+0

不要认为你可以导航的父母的水平有任何限制。你可以发布你的代码 – 2010-09-29 18:18:27

+0

有没有找到解决这个问题?我有同样的问题。 – Terry 2011-08-31 21:53:08

回答

0

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

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 

既然你想找到一个嵌套的内容占位符,你可能要寻父,然后使用该实例找到孩子

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中的默认值)。可能有一种方法可以通过编程来实现,但是“开箱即用”,这似乎允许你做你所问的问题,如果你能忍受这个警告。

祝你好运!