Asp.net 在具有不同页眉/页脚模板的转发器之间共享ItemTemplate

Asp.net 在具有不同页眉/页脚模板的转发器之间共享ItemTemplate,asp.net,webforms,repeater,Asp.net,Webforms,Repeater,我们有一组具有不同HeaderTemplates和FooterTemplates的中继器。不过,ItemTemplate对于它们都是相同的。我们如何在一群转发器之间共享ItemTemplate <asp:Repeater> <HeaderTemplate> <ul> </HeaderTemplate> <ItemTemplate> <li><%# Eval("ti

我们有一组具有不同HeaderTemplates和FooterTemplates的中继器。不过,ItemTemplate对于它们都是相同的。我们如何在一群转发器之间共享ItemTemplate

<asp:Repeater>
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li><%# Eval("title") %></li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

<asp:Repeater>
    <HeaderTemplate>
        <ol>
    </HeaderTemplate>
    <ItemTemplate>
        <li><%# Eval("title") %></li>
    </ItemTemplate>
    <FooterTemplate>
        </ol>
    </FooterTemplate>
</asp:Repeater>

<asp:Repeater>
    <HeaderTemplate>
        <p>This is some intro text.</p>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li><%# Eval("title") %></li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

与may comment相关,我建议尝试以下操作:定义唯一的OnItemDataBound事件,并将其应用于所有这些中继器。这样,您就可以在一个地方生成项目,代码隐藏

例如,在您的aspx中:

<asp:Repeater runat="server" id="repeaterA" OnItemDataBound="CommonItemDataBound">
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <asp:Literal runat="server" ID="HtmlContents"></asp:Literal>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

<asp:Repeater runat="server" id="repeaterB" OnItemDataBound="CommonItemDataBound">
    <HeaderTemplate>
        <ol>
    </HeaderTemplate>
    <ItemTemplate>
        <asp:Literal runat="server" ID="HtmlContents"></asp:Literal>
    </ItemTemplate>
    <FooterTemplate>
        </ol>
    </FooterTemplate>
</asp:Repeater>
然后,在您的代码隐藏中:

    protected void CommonItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        ((Literal)e.Item.FindControl("HtmlContents")).Text = string.Format("<li>{0}</li>", DataBinder.Eval(e.Item.DataItem, "title").ToString())
    }
}

我认为您在Itemtemplate中仅显示了一个示例中的元素,实际上您可能有更多的元素要共享。当谈到ASP.NET中的可恢复控件时,我想到了一件事,那就是UserControls,因此您可以通过创建这样的控件来实现:-

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RepeaterUC.ascx.cs" 
           Inherits="Demo.RepeaterUserControl" %>
<li><%# Eval("title") %></li>
最后在您的页面中注册并使用它:-

<%@ Register TagName="Fruits" TagPrefix="RC" Src="~/RepeaterUserControl.ascx" %>
 <ItemTemplate>
      <RC:Fruits runat="server"></RC:Fruits>
 </ItemTemplate>
 ...........and so on for other controls.

我想每个中继器的数据源都是不同的?也许您可以定义一个唯一的OnItemDataBound事件,并将其应用于所有这些中继器,然后从中准备ItemTemplate的内容。@zed Yes。它们都有不同的数据源。因此,方法是以编程方式而不是在标记中创建ItemTemplate。这是有道理的。然后我就可以在中继器之间分享了。在提供的示例中,我展示了如何呈现纯html。如果您需要在ItemTemplate中包含asp.net控件,则可以使用此方法。在这种情况下,我可能建议将整个转发器放在用户控件内,并在每次使用它时从用户控件外提供HeaderTemplate和FooterTemplate的内容。@zed-是的,这一点很好!但这一切都取决于OP的要求,他可以相应地操纵它。