【问题标题】:Accessing Grandparent Content Placeholder in Master Pages访问母版页中的祖父母内容占位符
【发布时间】:2011-11-09 08:02:37
【问题描述】:

我一直在网上搜索,但没有找到任何答案(关于堆栈溢出有几个很接近的问题,但它们似乎没有得到回答或相同),所以我想我会提出自己的一个.它围绕嵌套母版页和访问祖父母版的 Content PlaceHolder 的内容页面展开,即使它没有在父嵌套母版中重新公开。我想知道这是否不可能。

Core Site.Master

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">

        <title>
                <asp:ContentPlaceHolder ID="TitleContent" runat="server">
                    <%= Html.GlobalModel().PageTitle %>
                </asp:ContentPlaceHolder>
            </title>

            <asp:ContentPlaceHolder ID="HeadContent" runat="server">
            <link rel="shortcut icon" 
                href="<%= ViewContext.ClientContent( "Content/Tiki.ico" ) %>" 
                type="image/x-icon"/>
        </asp:ContentPlaceHolder>
    </head>
    <body>
        <asp:ContentPlaceHolder ID="SiteContent" runat="server"/>
    </body>
</html>

Nested Site.Master(请注意 TitleContent 和 HeadContent 未自定义,因此 Core Site.Master 中的“默认”内容应该会生效)

<%@ Master Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewMasterPage" %>

<asp:Content ContentPlaceHolderID="SiteContent" runat="server">
    <asp:ContentPlaceHolder ID="SiteContent" runat="server">

        <h1>Nested Header</h1>
        <asp:ContentPlaceHolder ID="NestedContent" runat="server"/>

    </asp:ContentPlaceHolder>
</asp:ContentPlaceHolder>

ContentView.aspx(引用 Nested Site.Master,尝试的 TitleContent 替换将不起作用。)

<%@ Page Language="C#" MasterPageFile="Site.Master" %>

<asp:Content ContentPlaceHolderID="NestedContent" runat="server">
    <p>Nested content.  This will work.</p>
</asp:Content>

<asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    Nested Title.  This will **not** work.
</asp:Content>

【问题讨论】:

  • 既然您使用的是 MVC,请查看 Razor。处理这种事情要好得多。我还没有在 webforms 中找到令人满意的解决这个问题的方法。
  • 您应该将答案归功于 Jon Adams。它可能不漂亮,但这是我们坚持的......
  • 好吧,我可以相信他,但本质上,代码的“重复”是我们最终得到的结果,并不是我真正希望的答案。但我想“不”的答案是一个有效的答案。有一天,当我们有时间迁移到 Razor 时,我将不得不查看他们的支持。

标签: asp.net nested master-pages contentplaceholder


【解决方案1】:

ContentPlaceHolderID 只能在以声明方式列出时引用其直接父级。

虽然不是最优雅的,但最简单的解决方法是使用相同的默认代码将 ContentPlaceHolders 复制到 Nested Site.Master。需要一些代码重复,但可以完成工作。

<%@ Master Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewMasterPage" %>

<asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    <asp:ContentPlaceHolder ID="NestedTitleContent" runat="server">
        <%= Html.GlobalModel().PageTitle %>
    </asp:ContentPlaceHolder>
</asp:ContentPlaceHolder>

<asp:Content ContentPlaceHolderID="SiteContent" runat="server">
    <asp:ContentPlaceHolder ID="SiteContent" runat="server">
        <h1>Nested Header</h1>
        <asp:ContentPlaceHolder ID="NestedContent" runat="server"/>
    </asp:ContentPlaceHolder>
</asp:ContentPlaceHolder>

如果您不想这样做,可以将占位符替换为知道何时显示什么的自定义控件。

或者如果你需要保持这种方式,你可以运行一堆代码来强制提前渲染到内存中的字符串/缓冲区并用它替换子控件——但这会很麻烦,而且值得怀疑。

但是这些解决方案中的任何一个都取决于您的情况。如果您提供更多背景信息,我们可以提供更具体的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多