ContentPlaceHolders:重复内容

bra*_*rad 10 asp.net master-pages contentplaceholder

脚本

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

母版页
<html>
  <body>
    <asp:ContentPlaceHolder ID="Foo" runat="server">
    </asp:ContentPlaceHolder>
    <!-- page content -->
    <asp:ContentPlaceHolder ID="Bar" runat="server">
    </asp:ContentPlaceHolder>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud) 内容页
<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
  <!-- content -->
</asp:Content>
<asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server">
  <!-- content repeated -->
</asp:Content>
Run Code Online (Sandbox Code Playgroud)

保养

如您所知,在代码中重复一些事情通常并不好.它会产生维护问题.以下是我想要做的,但由于重复的id属性,显然不会起作用:

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

可能?

有没有办法使用asp.net webforms做到这一点?解决方案不一定必须与上述内容相似,只需要以相同的方式工作.

笔记

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

Ego*_*hin 6

嘿,如果有人仍然需要一个解决方案,这就是我做的:把它放在你的母版页的代码文件中

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);
}
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*ave 5

在你只想重复一个字符串的情况下,这对我有用:

<asp:ContentPlaceHolder ID="TitleContent" runat="server" /> 
Run Code Online (Sandbox Code Playgroud)

可以在别处引用为:

<%  Dim title As LiteralControl = TitleContent.Controls.Item(0)
    Response.Write(title.Text)
%>
Run Code Online (Sandbox Code Playgroud)

不保证这是正确的行动方案虽然:)


Rob*_*Day 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>
Run Code Online (Sandbox Code Playgroud)

内容页

<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>
Run Code Online (Sandbox Code Playgroud)