Asp.net
ContentPlaceHolders:重複內容
設想
我有一個使用 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) %>但不保證這是正確的行動方案:)