2011-09-02 20 views
7

He estado buscando en la web y no encontré ninguna respuesta (hubo un par de preguntas cerradas sobre el desbordamiento de la pila pero no parecieron ser respondidas o ser idénticas), así que pensé Representaría uno de los míos. Se trata de páginas maestras anidadas y una página de contenido que accede al Content PlaceHolder del maestro de abuelos, incluso si no está reexpuesto en el maestro anidado principal. Me pregunto si esto no es posible.Accediendo al marcador de posición de contenido de abuelos en las páginas maestras

Site.Master Core

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

anidada Site.Master (observe cómo no fueron adaptados TitleContent y headcontent, por lo que el contenido de 'default' de Core Site.Master debería tener efecto)

<%@ 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 (referencia anidada Site.Master, la sustitución TitleContent intento no funcionará.)

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

Dado que está utilizando MVC, eche un vistazo a Razor. Es mucho mejor para manejar este tipo de cosas. Todavía no he encontrado una solución satisfactoria a este problema en formularios web. –

+0

Debería acreditar a Jon Adams a continuación con la respuesta. Puede que no sea lindo, pero es con lo que estamos trabajados ... – McGuireV10

+0

Bueno, puedo darle crédito, pero básicamente la 'duplicación' de código es con lo que terminamos y no era realmente la respuesta que esperaba para. Pero supongo que una respuesta de 'no' es una respuesta válida. Uno de estos días, cuando tengamos tiempo de migrar a Razor, tendré que verificar su apoyo. – Terry

Respuesta

6

ContentPlaceHolderIDs sólo pueden hacer referencia a su padre inmediato cuando aparece de forma declarativa.

La solución más fácil, aunque no la más elegante, sería copiar ContentPlaceHolders en Nested Site.Master con el mismo código predeterminado. Requiere un poco de duplicación de código, pero hace el trabajo.

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

Si no quiere hacer eso, usted podría reemplazar los marcadores de posición con controles personalizados que saben qué mostrar cuándo.

O si necesita mantenerlo de esta manera, podría ejecutar una gran cantidad de código para forzar la representación temprana a una cadena/memoria intermedia en memoria y reemplazar los controles secundarios con ella, pero eso sería una tonelada de molestia, y es dudoso si valdría la pena el esfuerzo.

Pero cualquiera de esas soluciones depende de su situación. Si proporcionó más contexto, podríamos proporcionarle consejos más específicos.

Cuestiones relacionadas