【问题标题】:ContentPlaceHolders: Repeated ContentContentPlaceHolders:重复内容
【发布时间】:2010-03-16 21:54:32
【问题描述】:

场景

我有一个使用 asp.net Master Pages 的应用程序,我想在其中重复页面顶部和底部的一些内容。目前我使用这样的东西:

母版页
<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 网络表单来做到这一点?解决方案不一定要与上述内容类似,只需以相同的方式工作即可。

注意事项

我在 Visual Studio 2008 中使用 asp.net 3.0

【问题讨论】:

  • 我有一个类似的问题,但我只想在我维护的代码中复制标题(出于各种原因)。

标签: asp.net master-pages contentplaceholder


【解决方案1】:

嘿,如果有人仍然需要解决这个问题,我就是这样做的: 将其放入母版页的代码文件中

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

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

【讨论】:

    【解决方案2】:

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

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

    可以在其他地方引用为:

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

    但不保证这是正确的做法:)

    【讨论】:

    • 一个非常好的观点,戴夫,为了实现我的目标,我实际上玩过这种东西。
    【解决方案3】:

    正如其他人所说,根据内容本身,可以根据内容的类型采取捷径。

    假设您需要“内容”来完全运行 asp.net 代码,那么我建议为每个包含内容本身的 ContentPage 使用 UserControl,然后您只需要复制一行代码。

    例子

    母版页

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

    【讨论】:

    • 感谢您的回复。这会起作用,但我觉得它会产生更多的维护问题而不是重复代码,因为我需要在每个页面的单独文件中单独控制。
    • 我同意,我现在唯一能想到的其他想法是循环通过控件并动态添加它们。不过,这会让您对事件处理程序感到无尽的痛苦。
    • 我不认为我在这些占位符中使用任何事件处理程序,主要是静态 html,所以这可能有效。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      根据内容,您可以在代码中执行此操作。如果它只是 HTML,只需将它放在一个变量中并将其分配给另一个。如果您有控件,您可以遍历控件集合并创建一个重复的控件并将其放置在另一个区域中。在任何一种情况下,第二个位置都不是 div 应有的内容占位符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 2017-05-17
        • 2018-01-02
        • 2012-04-19
        • 1970-01-01
        相关资源
        最近更新 更多