2

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

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

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

4

3 回答 3

4

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

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

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

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

于 2009-11-19T22:38:54.253 回答