6

Je suis, en utilisant MVC pour développer une application Web, et j'ai besoin d'utiliser MasterPages imbriquées dans mon site, afin de partager les composants visuels.Pages maîtres MVC imbriquées

J'ai deux pages maîtres et ContentPage:

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

Je veux faire référence à un ContentPlaceHolder placé sur le dessus Parent.master de la vue Contenu qui a Child.master comme MasterPage. Il semble que je puisse utiliser les ContentPlaceHolders du parent direct, mais pas du parent indirect. Voyons voir avec un échantillon:

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> 

Le résultat est que je peux voir Body content 1 et Body content 2 dans ma page, mais pas le page title.

+0

connexes Question http://stackoverflow.com/questions/947134/are-there-nested-maître-pages-dans-asp-net-mvc –

Répondre

5

Le détenteur de l'espace de contenu se référera uniquement aux espaces réservés de contenu dans son parent immédiat. Changez votre Child.master ce ceci:

<%@ 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> 

Ainsi, le Child.master agit essentiellement comme un « pass-through » pour l'espace réservé contenu Titre.

+0

Oui, mais c'est un peu gênant si vous avez beaucoup de sections. Merci quand même –

+0

C'est embêtant, mais hélas, c'est comme ça que ça fonctionne. :) Note, avec Razor dans MVC3 vous pouvez simplement faire ceci: @ {View.Title = "Mon titre"; } en haut de votre vue. –

0

Je suis sûr que vous devez ajouter le support de votre lieu de titre dans votre 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> 

et dans votre vue

<%@ 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

Cela ne fonctionne pas, il échoue avec: "Impossible de trouver le titre 'ContentPlaceHolder' dans la page principale '~/Views/Shared/Child.master' –

Questions connexes