2011-09-02 91 views
7

我一直在尋找網絡,沒有找到任何答案(有堆棧溢出,但他們似乎沒有得到答案或相同),所以我想我'我構成了我自己的一個。它圍繞嵌套的母版頁和訪問祖父母母版主內容的PlaceHolder的內容頁面進行,即使它不是在父嵌套母版中重新曝光。我想知道這是不可能的。在母版頁中訪問祖父母內容佔位符

核心的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怎麼沒有定製,所以從核心的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

既然你使用MVC,看看剃刀。處理這類事情要好得多。在webforms中,我還沒有找到令人滿意的解決方案。 –

+0

你應該在下面寫下Jon Adams的答案。它可能不是很漂亮,但這就是我們所堅持的...... – McGuireV10

+0

嗯,我可以給他信任,但實際上,代碼的「重複」是我們最終的結果,並不是我真正希望得到的答案對於。但我想「否」的答案是一個有效的答案。當我們有時間遷移到Razor的時候,我必須檢查他們的支持。 – Terry

回答

6

ContentPlaceHolderIDs只能在聲明式列出時引用其直接父級。

雖然不是最優雅的,但最簡單的修復方法是使用相同的默認代碼將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> 

如果你不想這樣做,你可以替換與知道如何展現時自定義控件的佔位符。

或者如果你需要這樣保留它,你可以運行一堆代碼來強制早期渲染到內存中的字符串/緩衝區,並用它替換子控件 - 但這將是一大麻煩,並且值得懷疑是否值得這個努力。

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