asp.net – 访问母版页中的祖父母内容占位符

我一直在网上搜索并没有找到任何答案(关于堆栈溢出有几个接近的问题,但它们似乎没有得到答案或相同),所以我想我会构成我自己的一个.它围绕嵌套母版页和访问祖父母大师的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>

嵌套的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(引用嵌套的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>

解决方法

ContentPlaceHolderIDs只能在声明性地列出时引用它们的直接父级.

最简单的解决方案,虽然不是最优雅的,但是将ContentPlaceHolders复制到具有相同代码的嵌套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>

如果您不想这样做,可以使用知道何时显示内容自定义控件替换占位符.

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

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

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...