2

マスター ページを使用するページに、マスター ページの ContentPlaceHolders の 1 つに対する asp:Content コントロールがない場合、代わりに既定のコンテンツが表示されます。そのContentPlaceHolderの asp:Content コントロールを持つページでその既定のコンテンツを使用したいと考えています。

マスター ページを使用するページで、既定のコンテンツを使用するか、ページ固有のコンテンツを使用するかをコードで決定したいと考えています。ContentPlaceHolderID の asp:Content コントロールのコンテンツではなく、マスター ページの既定のコンテンツを表示するにはどうすればよいですか?

たとえば、メニュー用の ContentPlaceHolder があるとします。デフォルトのコンテンツは、基本的なメニューを示しています。ページはクエリからメニューを構築しますが、クエリの結果がない場合は、デフォルトのメニューを表示したいと考えています。ただし、既定では、空の asp:Content コントロールが表示されます。代わりに、マスター ページの既定のコンテンツを取得するにはどうすればよいですか?

4

3 に答える 3

4

これを行う 1 つの方法は、Page_Load 内のプレースホルダー コンテンツのコントロール コレクションをクリアし、更新されたメニューを追加することです。

protected void Page_Load(object sender, EventArgs e)
{
    if(needsBetterMenu)
    {
        ContentPlaceHolder holder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
        holder.Controls.Clear();
        holder.Controls.Add(betterMenu);
    }
}
于 2009-10-20T18:39:36.790 に答える
1

私が思いついた最善の方法は、ContentPlaceHolder で既定のコンテンツを使用しないことです。代わりに、ContentPlaceHolder に隣接する PlaceHolder に既定のコンテンツを追加しました。

<asp:ContentPlaceHolder ID="Menu" runat="server" /><!-- no default content -->
<asp:PlaceHolder runat=server ID="DefaultContentForMenu" Visible=false
    EnableViewState=false >Default menu content here</asp:PlaceHolder>

次に、ForceDefaultContentForMenu プロパティをマスター ページに追加して、マスター ページを使用するページが、ページが独自のコンテンツを提供する場合でも既定のコンテンツを使用するように指定できるようにしました。

ForceDefaultContentForMenu プロパティが true の場合、またはコンテンツ プレースホルダーが空の場合、マスター ページの Render メソッドは既定のコンテンツを表示します。

protected override void Render(HtmlTextWriter writer)
{
    if (ForceDefaultContentForMenu || !Menu.HasControls())
    {
        Menu.Controls.Clear();
        DefaultContentForMenu.Visible = true;
    }
    base.Render(writer);
}

マスター ページを使用するページは、メニュー コンテンツ プレースホルダーに独自のコンテンツを追加しない場合、既定で既定のコンテンツを取得しますが、独自のコンテンツの代わりに既定のコンテンツを使用するように指定できます。

このアプローチで私が見つけた唯一の欠点は、Visual Studio がコンテンツ領域をページに追加するときに、既定のコンテンツがコピーされないことです。私が行っている作業では、これは欠点ではなく利点です。ページにコンテンツ領域を追加するのは、デフォルトのコンテンツが必要ないからです。

于 2009-11-23T22:47:33.540 に答える
0

子ページのコード ビハインドでマスター ページのコンテンツを変更しても問題ない場合は、次の操作を実行できます。

編集するマスター ページの html コントロールに runat="server" を追加します。

Site.Master

...
<ul id="menu" runat="server">
    <li><a href="#">Link 1</a></li>
    <li><a href="#">Link 2</a></li>
</ul>
...

次に、メニュー コンテンツを変更する必要がある子ページのコード ビハインドに、次のコードを追加します。

protected void Page_Load(object sender, EventArgs e)
    {
        HtmlGenericControl c = Master.FindControl("menu") as HtmlGenericControl;

        if (c != null)
        {
            c.Controls.Clear();
            c.Controls.Add(new HtmlGenericControl("li") { InnerHtml = "<a href=\"#\">Link 3</a>" });
        }
    }

またはメニューコントロールに入れたいhtml。

コードのないページは、次の html を出力します。

<ul id="ctl00_menu">
    <li><a href="#">Link 1</a></li>
    <li><a href="#">Link 2</a></li>
</ul>

そして、コードを含むページには次のように表示されます。

<ul id="ctl00_menu">
    <li><a href="#">Link 3</a></li>
</ul>

明らかに、このコードをそのまま使用したくないでしょう。これはプロトタイプに過ぎませんでした。任意のコントロールにコンテンツを追加できるようにリファクタリングし、すべてのページが継承する基本ページ クラスにスローします。

于 2009-11-19T22:38:54.253 に答える