【问题标题】:Can content page use ContentPlaceHolderID of master parent of its master page (nested master pages)内容页面能否使用其母版页的母版父级的 ContentPlaceHolderID(嵌套母版页)
【发布时间】:2010-09-29 18:07:15
【问题描述】:

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

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

内容页面能否仅使用其直接父级 ContentPlaceHolders 或它们也可以使用任何更高的母版页?

【问题讨论】:

  • 不要认为您可以导航到的父级有任何限制。你能发布你的代码吗
  • 找到解决方案了吗?我也遇到了同样的问题。

标签: asp.net master-pages nested


【解决方案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 的默认设置。)可能有一种方法可以通过编程方式执行此操作,但是“开箱即用”这似乎允许您按照您的要求做,如果您可以接受这个警告的话。

祝你好运!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      获取母版页上控件的值 在运行时,母版页与内容页合并,因此母版页上的控件可供内容页代码访问。 (如果母版页包含 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多