代码之家  ›  专栏  ›  技术社区  ›  brad

内容占位符:重复的内容

  •  9
  • brad  · 技术社区  · 15 年前

    脚本

    我有一个使用ASP.NET母版页的应用程序,我想在页面的顶部和底部重复一些内容。目前我用的是这样的东西:

    母版页
    <html>
      <body>
        <asp:ContentPlaceHolder ID="Foo" runat="server">
        </asp:ContentPlaceHolder>
        <!-- page content -->
        <asp:ContentPlaceHolder ID="Bar" runat="server">
        </asp:ContentPlaceHolder>
      </body>
    </html>
    
    内容页面
    <asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
      <!-- content -->
    </asp:Content>
    <asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server">
      <!-- content repeated -->
    </asp:Content>
    

    维护

    如你所知,在代码中重复一些事情通常是不好的。它会造成维护问题。下面是我想要做的,但是由于重复的id属性,显然不会工作:

    母版页
    <html>
      <body>
        <asp:ContentPlaceHolder ID="Foo" runat="server">
        </asp:ContentPlaceHolder>
        <!-- page content -->
        <asp:ContentPlaceHolder ID="Foo" runat="server">
        </asp:ContentPlaceHolder>
      </body>
    </html>
    
    内容页面
    <asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
      <!-- content (no repetition) -->
    </asp:Content>
    

    可能吗?

    有没有一种使用ASP.NET WebForms来实现这一点的方法?解决方案不一定要与上述内容相似,它只需要以相同的方式工作。

    笔记

    我正在Visual Studio 2008中使用ASP.NET 3.0

    5 回复  |  直到 14 年前
        1
  •  3
  •   Robin Day    15 年前

    正如其他人所说,根据内容本身的不同,根据将要出现的内容类型,可以使用快捷方式。

    但是,假设您需要“内容”完全运行ASP.NET代码,那么我建议为每个包含内容本身的内容页提供一个用户控件,然后您只需要复制一行代码。

    例子

    母版页

    <html>
        <body>
            <asp:ContentPlaceHolder ID="Foo" runat="server">
            </asp:ContentPlaceHolder>
            <!-- page content -->
            <asp:ContentPlaceHolder ID="Bar" runat="server">
            </asp:ContentPlaceHolder>
        </body>
    </html>
    

    内容页面

    <asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
        <uc1:Page1Control id="page1Control1" runat="server" />
    </asp:Content>
    <asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server">
        <uc1:Page1Control id="page1Control2" runat="server" />
    </asp:Content>
    
        2
  •  5
  •   Dave    15 年前

    如果您只想重复一个字符串,这对我很有用:

    <asp:ContentPlaceHolder ID="TitleContent" runat="server" /> 
    

    可在其他地方引用为:

    <%  Dim title As LiteralControl = TitleContent.Controls.Item(0)
        Response.Write(title.Text)
    %>
    

    不过,这是正确的行动方案,对此不作保证:)

        3
  •  5
  •   Egor Pavlikhin    15 年前

    嘿,如果有人还需要解决这个问题,我就是这样做的: 把它放在母版页的代码文件中

    protected override void RenderChildren(HtmlTextWriter writer)
    {
        Control mainPlaceHolder = FindControl("MainContentPlaceHolder");
        Control doublePlaceHolder = FindControl("ContentDoublePlaceHolder");
    
        StringBuilder sb = new StringBuilder();
    
        using (StringWriter sw = new StringWriter(sb))
        using (HtmlTextWriter tw = new HtmlTextWriter(sw))
        {
            mainPlaceHolder.RenderControl(tw);
        }
    
        LiteralControl lc = new LiteralControl(sb.ToString());
        doublePlaceHolder.Controls.Add(lc);
    
        base.RenderChildren(writer);
    }
    

    我不确定这里的性能问题,但它确实有效。

        4
  •  1
  •   Kirtan    15 年前

    您可以为同一个控件创建一个公共用户控件,并将其添加到位于顶部和底部的母版页中。可以创建一个属性,描述控件是在顶部还是底部加载。

        5
  •  0
  •   Jeremy    15 年前

    根据内容的不同,您可以在代码中执行此操作。如果它只是HTML,就把它放在一个变量中,然后把它赋给另一个变量。如果有控件,则可以循环控件集合,并创建一个重复的控件并将其放置在其他区域。在这两种情况下,第二个位置都不是DIV应该到期的ContentPlaceholder。