显示具有完全不同的html表示的项列表
本文关键字:html 表示 列表 显示 | 更新日期: 2023-09-27 17:51:09
假设我有一个想要在html中显示的项目列表。例如可以是:
List<MyBusinessObject> item;
其中MyBusinessObject定义为:
public class MyBusinessObject
{
public string Value1{ get; set; };
public string Value2{ get; set; };
public string Value3{ get; set; };
public CategoryEnum Category{ get; set; };
}
假设我想根据类别用完全不同的html(例如不同的标签和css类)显示每个MyBusinessObject。
你怎么解决这个问题?
我建议添加一个Repeater
和一个MultiView
到ItemTemplate。repeater允许添加自定义ItemTemplate, MultiView提供了在不同视图之间切换的简单方法。在Repeater的ItemDataBound事件处理程序中,可以设置MultiView
的正确视图。
中继器的标记
<asp:Repeater ID="rpt" runat="server" OnItemDataBound="rpt_ItemDataBound">
<ItemTemplate>
<asp:MultiView ID="multiView" runat="server" ActiveViewIndex="0">
<asp:View runat="server">
<asp:Panel runat="server">
<h1>View 1 -
<asp:Label runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "Category") %>' />
</h1>
<asp:Label runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' />
</asp:Panel>
</asp:View>
<asp:View runat="server">
<asp:Panel runat="server">
<h1>View 2 -
<asp:Label runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "Category") %>' />
</h1>
<asp:Label runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' />
</asp:Panel>
</asp:View>
</asp:MultiView>
</ItemTemplate>
</asp:Repeater>
后台代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
var items = new List<MyDataItem>();
items.Add(new MyDataItem() { Name = "Item1", Category = "Cat1" });
items.Add(new MyDataItem() { Name = "Item2", Category = "Cat2" });
items.Add(new MyDataItem() { Name = "Item3", Category = "Cat1" });
items.Add(new MyDataItem() { Name = "Item4", Category = "Cat2" });
items.Add(new MyDataItem() { Name = "Item5", Category = "Cat1" });
rpt.DataSource = items;
rpt.DataBind();
}
}
protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item
|| e.Item.ItemType == ListItemType.AlternatingItem)
{
var multiView = e.Item.FindControl("multiView") as MultiView;
if (multiView != null)
multiView.ActiveViewIndex =
((MyDataItem)e.Item.DataItem).Category == "Cat1" ? 0 : 1;
}
}
public class MyDataItem
{
public string Name { get; set; }
public string Category { get; set; }
}