Asp.net 在具有不同页眉/页脚模板的转发器之间共享ItemTemplate
我们有一组具有不同HeaderTemplates和FooterTemplates的中继器。不过,ItemTemplate对于它们都是相同的。我们如何在一群转发器之间共享ItemTemplateAsp.net 在具有不同页眉/页脚模板的转发器之间共享ItemTemplate,asp.net,webforms,repeater,Asp.net,Webforms,Repeater,我们有一组具有不同HeaderTemplates和FooterTemplates的中继器。不过,ItemTemplate对于它们都是相同的。我们如何在一群转发器之间共享ItemTemplate <asp:Repeater> <HeaderTemplate> <ul> </HeaderTemplate> <ItemTemplate> <li><%# Eval("ti
<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的要求,他可以相应地操纵它。