使用ContentPlaceHolder的默认内容而不是页面的内容

时间:2009-10-20 17:41:37

标签: asp.net master-pages contentplaceholder

当使用母版页的页面没有母版页的ContentPlaceHolders之一的asp:Content控件时,会显示默认内容。我想在确实具有该ContentPlaceHolder的asp:Content控件的页面上使用该默认内容。

在使用母版页的页面中,我想在代码中决定是使用默认内容还是特定于页面的内容。如何显示母版页中的默认内容,而不是ContentPlaceHolderID的asp:Content控件中的内容?

例如,假设我有一个菜单的ContentPlaceHolder。默认内容显示基本菜单。该页面根据查询构建菜单,但如果查询没有结果,我想显示默认菜单。但是,默认情况下,将显示空的asp:Content控件。如何获取母版页的默认内容?

3 个答案:

答案 0 :(得分:3)

一种方法是清除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);
    }
}

答案 1 :(得分:1)

我提出的最佳方法是不使用ContentPlaceHolder中的默认内容。相反,我在与PlacePlaceHolder相邻的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将内容区域添加到页面时,不会复制默认内容。对于我正在做的工作,这是一个好处而不是一个缺点,因为如果我将内容区域添加到页面,那是因为我不想要默认内容。

答案 2 :(得分:0)

如果您可以在子页面后面的代码中更改母版页的内容,则可以执行以下操作:

将runat =“server”添加到要编辑的母版页中的html控件:

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

显然你不想按原样使用这段代码。这只是一个原型。我会重构它以允许向任何控件添加内容并将其放入我的所有页面都将继承的基页类。