我有一个三级嵌套的主页面和一个内容页。parent1是顶级父级,parent2是parent3的父级,parent3是内容页的父级。
我收到一个错误信息 '无法找到ContentPlaceHolder xxx...
',其中xxx是ContentPlaceholder。它位于parent2中,而内容页正在尝试填充它。
内容页只能使用其直接父级ContentPlaceHolders吗?还是也可以使用任何更高的主页面?
我有一个三级嵌套的主页面和一个内容页。parent1是顶级父级,parent2是parent3的父级,parent3是内容页的父级。
我收到一个错误信息 '无法找到ContentPlaceHolder xxx...
',其中xxx是ContentPlaceholder。它位于parent2中,而内容页正在尝试填充它。
内容页只能使用其直接父级ContentPlaceHolders吗?还是也可以使用任何更高的主页面?
有一种方法可以做到这一点,但在某些情况下,如果您依赖于占位符的任何默认内容,则会出现轻微问题。
在您的示例中,您有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的默认值。)也许有一种以编程方式实现这一点的方法,但“开箱即用”似乎允许您做您所要求的事情,如果您能接受这个警告。
祝你好运!
我相信内容页面只能使用直接父级的ContentPlaceHolder。
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
如果你想找到一个嵌套的内容占位符,你可能需要先找到父级,然后使用该实例来查找子级。