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
嘿,如果有人仍然需要一个解决方案,这就是我做的:把它放在你的母版页的代码文件中
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)
我不确定这里的性能问题,但它确实有效.
在你只想重复一个字符串的情况下,这对我有用:
<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)
不保证这是正确的行动方案虽然:)
正如其他人所说,根据内容本身,可以根据内容的类型采取一些捷径。
然而,假设您需要“内容”是功能齐全的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)