6

Ich benutze MVC, um eine Webanwendung zu entwickeln, und ich muss verschachtelte MasterPages in meiner Site verwenden, um die Visual Components zu teilen.Verschachtelte MVC-Musterseiten

Ich habe zwei Masterseiten und einen Content:

  • Parent.master
  • Child.master
  • Content.aspx

Ich möchte ein Content auf der Spitze platziert verweisen Parent.master aus der Inhaltsansicht mit Child.master als MasterPage. Es scheint, dass ich die ContentPlaceHolders von der direkten Eltern, aber nicht von der indirekten Eltern verwenden kann. Beginnen wir mit einer Probe sehen:

Parent.master

<%@ Master Language="C#" 
    Inherits="System.Web.Mvc.ViewMasterPage"%> 
    <HTML> 
     <head runat="server"> 
     <title> 
      <asp:contentplaceholder id="Title" runat="server" /> 
     </title> 
    </head> 
    <body> 
     <asp:contentplaceholder id="Body" runat="server" /> 
    </body> 
    <HTML> 

Child.Master

<%@ Master Language="C#" MasterPageFile="~/Views/Shared/Parent.master" 
    Inherits="System.Web.Mvc.ViewMasterPage"%> 
<asp:Content ID="BodyContent" ContentPlaceHolderID="Body" runat="server"> 
    <asp:contentplaceholder id="Body1" runat="server" /> 
    <asp:contentplaceholder id="Body2" runat="server" /> 
</asp:Content> 

Content.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Child.master" 
    Inherits="System.Web.Mvc.ViewPage" %> 
<asp:Content ID="TitleContent" ContentPlaceHolderID="Title" runat="server"> 
    <!-- Placed to the top parent Master page (does not work) --> 
    The page title 
</asp:Content> 
<asp:Content ID="Body1Content" ContentPlaceHolderID="Body1" runat="server"> 
    <!-- Placed in the direct parent Master page (Works) --> 
    Body content 1 
</asp:Content> 
<asp:Content ID="Body2Content ContentPlaceHolderID="Body2" runat="server"> 
    <!-- Placed in the direct parent Master page (Works) --> 
    Body content 2 
</asp:Content> 

Das Ergebnis ist, dass ich Body content 1 und Body content 2 auf meiner Seite sehen kann, aber nicht die page title.

+0

Verwandte Frage http://stackoverflow.com/questions hinzufügen/947134/sind-dort-verschachtelte-Master-Seiten-in-asp-net-mvc –

Antwort

5

Der Platzhalter für Inhalte bezieht sich nur auf die Inhaltsplatzhalter in seiner sofortigen übergeordneten Komponente. Ändern Sie Ihre Child.master diese folgt aus:

<%@ Master Language="C#" MasterPageFile="~/Views/Shared/Parent.master" Inherits="System.Web.Mvc.ViewMasterPage"%> 
<asp:Content ID="BodyContent" ContentPlaceHolderID="Body" runat="server"> 
    <asp:Content ContentPlaceHolderID="Title" runat="server"> 
    <asp:contentplaceholder id="TitleContent" runat="server" /> 
    </asp:Content> 
    <asp:contentplaceholder id="Body1" runat="server" /> 
    <asp:contentplaceholder id="Body2" runat="server" /> 
</asp:Content> 

So ist die Child.master wirkt im Wesentlichen wie ein "Pass-Through" für den Titel Inhalt Platzhalter.

+0

Ja, aber das ist ein bisschen nervig, wenn Sie viele Abschnitte haben. Danke trotzdem –

+0

Es ist nervig, aber leider funktionieren Masterpages. :) Hinweis, mit Razor in MVC3 kannst du das einfach machen: @ {View.Title = "My title"; } an der Spitze Ihrer Ansicht. –

0

Ich bin mir ziemlich sicher, dass Sie Ihren Titel Platzhalter in Ihrem child.master

<%@ Master Language="C#" MasterPageFile="~/Views/Shared/Parent.master" 
    Inherits="System.Web.Mvc.ViewMasterPage"%> 
<asp:Content ID="TitleContent" ContentPlaceHolderID="Title" runat="server" /> 
<asp:Content ID="BodyContent" ContentPlaceHolderID="Body" runat="server"> 
    <asp:contentplaceholder id="Body1" runat="server" /> 
    <asp:contentplaceholder id="Body2" runat="server" /> 
</asp:Content> 

und Ihrer Ansicht nach

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Child.master"  
    Inherits="System.Web.Mvc.ViewPage" %> 
<asp:Content ID="TitleContent1" ContentPlaceHolderID="TitleContent" runat="server"> 
    <!-- Placed to the top parent Master page (does not work) --> 
    The page title 
</asp:Content> 
<asp:Content ID="Body1Content" ContentPlaceHolderID="Body1" runat="server"> 
    <!-- Placed in the direct parent Master page (Works) --> 
    Body content 1 
</asp:Content> 
<asp:Content ID="Body2Content ContentPlaceHolderID="Body2" runat="server"> 
    <!-- Placed in the direct parent Master page (Works) --> 
    Body content 2 
</asp:Content> 
+0

Dies funktioniert nicht, schlägt fehl mit: "ContentPlaceHolder 'Title' kann nicht auf der Masterseite '~/Views/Shared/Child.master' gefunden werden –