Доступ к меткам-заполнителям контента дедушки на главных страницах - PullRequest
7 голосов
/ 02 сентября 2011

Я искал в Интернете и не нашел никаких ответов (было несколько близких вопросов о переполнении стека, но они, похоже, не получили ответа или не были идентичны), поэтому я решил поставить один из своих , Он вращается вокруг вложенных главных страниц и страницы содержимого, обращающейся к Content PlaceHolder мастера-прародителя, даже если он не повторно выставлен в родительском вложенном мастере. Мне интересно, если это невозможно.

Базовый сайт. Мастер

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

1 Ответ

6 голосов
/ 22 сентября 2011

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>

Если вы не хотите этого делать, вы можете заменить заполнители на пользовательские элементы управления, которые знают, что показывать, когда.

Или, если вам нужно сохранить это таким образом, вы можете запустить кучу кода для принудительного раннего рендеринга в строку / буфер в памяти и заменить его дочерними элементами управления - но это будет тонна хлопот, и это сомнительно, еслиэто стоило бы усилий.

Но любое из этих решений зависит от вашей ситуации.Если бы вы предоставили больше контекста, мы могли бы дать более конкретный совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...