Asp.net 内容占位符:重复的内容 脚本

Asp.net 内容占位符:重复的内容 脚本,asp.net,master-pages,contentplaceholder,Asp.net,Master Pages,Contentplaceholder,我有一个使用asp.net母版页的应用程序,我想在页面的顶部和底部重复一些内容。目前我使用的是这样的东西: 母版页 内容页 维修 正如您所知,在代码中重复一些事情通常是不好的。这会造成维护问题。以下是我想做的,但由于重复id属性,显然不起作用: 母版页 内容页 可能的 有没有办法使用asp.net webforms来实现这一点?解决方案不一定要类似于上述内容,它只需要以相同的方式工作 笔记 我正在Visual Studio 2008中使用asp.net 3.0您可以为其创建一个通

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

母版页

内容页

维修 正如您所知,在代码中重复一些事情通常是不好的。这会造成维护问题。以下是我想做的,但由于重复id属性,显然不起作用:

母版页

内容页

可能的 有没有办法使用asp.net webforms来实现这一点?解决方案不一定要类似于上述内容,它只需要以相同的方式工作

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

您可以为其创建一个通用用户控件,并将其添加到主页面顶部和底部。您可以创建一个属性来描述控件是在顶部还是底部加载。

这取决于您可以在代码中执行此操作的内容。如果只是HTML,只需将其放入一个变量中,并将其分配给另一个变量即可。如果有控件,可以在控件集合上循环,创建一个重复控件并将其放置在其他区域中。在任何一种情况下,第二个位置都不会是div到期的contentplaceholder。

正如其他人所说,根据内容本身,可以根据将在那里的内容类型选择快捷方式

但是,假设您需要“内容”才能完全发挥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>

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

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

可在其他地方引用为:

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


尽管如此,我不保证这是正确的做法:)

嘿,如果有人还需要解决这个问题,我就是这么做的: 将其放入母版页的代码文件中

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

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

感谢您的回复。这会起作用,但我觉得这会造成更多的维护问题,而不是重复代码,因为我需要在每个页面的单独文件中使用单独的控件。我同意,目前我唯一能想到的另一个方法是通过控件循环并动态添加它们。不过,这会给事件处理程序带来无尽的痛苦。我不认为我在这些占位符中使用任何事件处理程序,主要是静态html,所以这可能会起作用。我有一个类似的问题,但我只想在我维护的代码中复制标题(出于各种原因)。这是一个非常好的观点Dave,事实上,我玩这种游戏是为了实现我的目标。
<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>
<asp:ContentPlaceHolder ID="TitleContent" runat="server" /> 
<%  Dim title As LiteralControl = TitleContent.Controls.Item(0)
    Response.Write(title.Text)
%>
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);
}