我有一个使用asp.net母版页的应用程序,我想在页面顶部和底部重复一些内容。目前我使用的是这样的东西:
母版页<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
答案 0 :(得分: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);
}
我不确定这里的性能问题,但它确实有效。
答案 1 :(得分:5)
如果您只想重复一个字符串,这对我有用:
<asp:ContentPlaceHolder ID="TitleContent" runat="server" />
可在其他地方引用:
<% Dim title As LiteralControl = TitleContent.Controls.Item(0)
Response.Write(title.Text)
%>
不保证这是正确的行动方案:)
答案 2 :(得分: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>
答案 3 :(得分:1)
您可以为其创建一个COMMON用户控件,并将其添加到顶部和顶部的主页面中。底部。您可以创建一个属性来描述控件是在顶部还是底部加载。
答案 4 :(得分:0)
根据内容,您可以在代码中执行此操作。如果它只是将HTML放在变量中并将其分配给另一个变量。如果您有控件,则可以循环控件集合并创建重复控件并将其放在其他区域中。在任何一种情况下,第二个位置都不是div应该到期的内容占有者。