Asp.net

訪問母版頁中的祖父母內容佔位符

  • September 22, 2011

我一直在網上搜尋並沒有找到任何答案(關於堆棧溢出有幾個很接近的問題,但它們似乎沒有得到回答或相同),所以我想我會提出自己的一個。它圍繞嵌套母版頁和訪問祖父母版的 Content PlaceHolder 的內容頁面,即使它沒有在父嵌套母版中*重新公開。*我想知道這是否不可能。

核心站點.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(引用 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>

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>

如果您不想這樣做,您可以用知道何時顯示什麼的自定義控制項替換佔位符。

或者如果你需要保持這種方式,你可以執行一堆程式碼來強制提前渲染到記憶體中的字元串/緩衝區並用它替換子控制項——但這會很麻煩,如果它是值得懷疑的值得付出努力。

但是這些解決方案中的任何一個都取決於您的情況。如果您提供更多上下文,我們可以提供更具體的建議。

引用自:https://stackoverflow.com/questions/7286539