代码之家  ›  专栏  ›  技术社区  ›  Joseph Anderson

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

  •  2
  • Joseph Anderson  · 技术社区  · 16 年前

    如果使用母版页的页面没有用于母版页某个ContentPlaceholder的ASP:Content控件,则会显示默认内容。我想在一个 为该ContentPlaceholder提供一个ASP:Content控件。

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

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

    3 回复  |  直到 16 年前
        1
  •  3
  •   Mike J    16 年前

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

    protected void Page_Load(object sender, EventArgs e)
    {
        if(needsBetterMenu)
        {
            ContentPlaceHolder holder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
            holder.Controls.Clear();
            holder.Controls.Add(betterMenu);
        }
    }
    
        2
  •  1
  •   Joseph Anderson    16 年前

    我想到的最佳方法是不要在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>
    

    然后,我向母版页添加了forceDefaultContentFormMenu属性,以便使用母版页的页面可以指定即使页面提供了自己的内容,也应使用默认内容。

    如果forcedefaultcontentformenu属性为true或内容占位符为空,母版页的呈现方法将显示默认内容:

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

    现在,如果使用母版页的页面不为菜单内容占位符添加自己的内容,但可以指定应使用默认内容而不是自己的内容,那么默认情况下,使用母版页的页面将获得默认内容。

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

        3
  •  0
  •   Jason    16 年前

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

    将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>" });
            }
        }
    

    或者你想放在菜单控件中的任何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>
    

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

    推荐文章