Asp.net

ContentPlaceHolders:重複內容

  • March 16, 2010

設想

我有一個使用 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 webforms 做到這一點?解決方案不一定要與上述內容相似,它只需要以相同的方式工作。

筆記

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

嘿,如果有人仍然需要這個解決方案,這就是我所做的:把它放在你的母版頁的程式碼文件中

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

我不確定這裡的性能問題,但它確實有效。

如果您只想重複一個字元串,這對我有用:

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

可以在別處引用為:

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

但不保證這是正確的行動方案:)

引用自:https://stackoverflow.com/questions/760334