Asp.net 使用ContentPlaceHolder';s默认内容,而不是页面';内容

Asp.net 使用ContentPlaceHolder';s默认内容,而不是页面';内容,asp.net,master-pages,contentplaceholder,Asp.net,Master Pages,Contentplaceholder,如果使用母版页的网页的某个内容占位符没有asp:Content控件,则会显示默认内容。我想在没有该ContentPlaceHolder的asp:content控件的页面上使用该默认内容 在使用母版页的页面中,我想在代码中决定是使用默认内容还是特定于页面的内容。如何显示母版页中的默认内容,而不是ContentPlaceholder ID的asp:content控件中的内容 例如,假设我有一个菜单的内容占位符。默认内容显示基本菜单。页面根据查询构建菜单,但是如果查询没有结果,我想显示默认菜单。默认情

如果使用母版页的网页的某个内容占位符没有asp:Content控件,则会显示默认内容。我想在没有该ContentPlaceHolder的asp:content控件的页面上使用该默认内容

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


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

一种方法是清除页面加载中占位符内容的控件集合,并添加更新的菜单

protected void Page_Load(object sender, EventArgs e)
{
    if(needsBetterMenu)
    {
        ContentPlaceHolder holder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
        holder.Controls.Clear();
        holder.Controls.Add(betterMenu);
    }
}

如果您对在子页面的代码隐藏中更改母版页的内容感到满意,则可以执行以下操作:

<ul id="ctl00_menu">
    <li><a href="#">Link 3</a></li>
</ul>
将runat=“server”添加到要编辑的母版页中的html控件:

地点,主人

...
<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>" });
        }
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
HtmlGenericControl c=Master.FindControl(“菜单”)作为HtmlGenericControl;
如果(c!=null)
{
c、 控件。清除();
c、 添加(新的HtmlGenericControl(“li”){InnerHtml=”“});
}
}
或者任何你想放在菜单控件中的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>

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

我提出的最佳方法是不在ContentPlaceHolder中使用默认内容。相反,我在ContentPlaceHolder旁边的占位符中添加了默认内容:

<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>
现在,如果使用母版页的页面没有为菜单内容占位符添加自己的内容,则默认情况下将获得默认内容,但可以指定使用默认内容而不是自己的内容


我发现这种方法的唯一缺点是,当VisualStudio将内容区域添加到页面时,默认内容不会被复制。对于我正在做的工作来说,这是一个优点而不是缺点,因为如果我将内容区域添加到页面,这是因为我不想要默认内容。

可能应该在Init而不是page_Load中执行此操作,以便在betterMenu上触发事件。我会记住此提示。是的,如果需要,最好在Init stage上添加控件并注册生命周期事件。这是假设使用母版页的页面没有ContentPlaceholder 1的asp:Content控件。我想找到一种方法来访问默认内容,即使添加了asp:content。