我一直在网上搜索并没有找到任何答案(关于堆栈溢出有几个接近的问题,但它们似乎没有得到答案或相同),所以我想我会构成我自己的一个。它围绕嵌套母版页和访问祖父母大师的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>
答案 0 :(得分:6)
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>
如果您不想这样做,可以使用知道何时显示内容的自定义控件替换占位符。
或者如果你需要保持这种方式,你可以运行一堆代码来强制早期渲染到内存中的字符串/缓冲区并用它替换子控件 - 但这将是一个麻烦,它是怀疑是否值得努力。
但任何这些解决方案都取决于您的情况。如果您提供了更多背景信息,我们可以提供更具体的建议。