8

私はウェブを検索していて、答えが見つかりませんでした (スタック オーバーフローに関するいくつかの密接な質問がありましたが、答えが得られなかったり、同一であるとは思われませんでした)。親のネストされたマスターで再公開されていない場合でも、ネストされたマスター ページと祖父母マスターの Content PlaceHolder にアクセスするコンテンツ ページを中心に展開します。これができないかどうか疑問に思っています。

Core 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 がカスタマイズされていないことに注意してください。そのため、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>
4

1 に答える 1

7

ContentPlaceHolderID は、宣言的にリストされている場合にのみ直接の親を参照できます。

最も簡単な修正方法は、最も洗練された方法ではありませんが、同じデフォルト コードを使用して 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>

それをしたくない場合は、プレースホルダーをいつ何を表示するかを知っているカスタム コントロールに置き換えることができます。

または、この方法を維持する必要がある場合は、一連のコードを実行して、メモリ内の文字列/バッファーへの早期レンダリングを強制し、子コントロールをそれで置き換えることができますが、それは非常に面倒であり、努力する価値があるでしょう。

ただし、これらの解決策は状況によって異なります。より多くのコンテキストを提供していただければ、より具体的なアドバイスを提供できます。

于 2011-09-22T14:47:52.260 に答える