在具有不同页眉/页脚模板的中继器之间共享ItemTemplate

时间:2015-04-28 17:09:03

标签: asp.net webforms repeater

我们有一堆具有不同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>

2 个答案:

答案 0 :(得分:0)

与may评论相关,我建议尝试以下方法:定义一个唯一的OnItemDataBound事件,并将其作为所有那些Repeater。通过这种方式,您可以在一个地方生成项目,代码在后面。

例如,在你的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())
    }
}

答案 1 :(得分:0)

我认为你从示例前瞻性中只显示了Itemtemplate中的一个元素,实际上你可能有更多元素要分享。当涉及到ASP.NET中的Resuable控件时,我想到了一件事,那就是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.