C# 显示具有完全不同的html表示形式的项目列表
假设我有一个要在html中显示的项目列表。例如,它可以是:C# 显示具有完全不同的html表示形式的项目列表,c#,asp.net,webforms,C#,Asp.net,Webforms,假设我有一个要在html中显示的项目列表。例如,它可以是: List<MyBusinessObject> item; 假设我希望根据类别使用根本不同的html(例如,不同的标记和css类)显示每个MyBusinessObject 您将如何解决此问题?我建议在ItemTemplate中添加a和a。repeater允许添加自定义ItemTemplate,而MultiView提供了在不同视图之间切换的简单方法。在中继器的ItemDataBound事件处理程序中,可以设置多视图的正确视图
List<MyBusinessObject> item;
假设我希望根据类别使用根本不同的html(例如,不同的标记和css类)显示每个MyBusinessObject
您将如何解决此问题?我建议在ItemTemplate中添加a和a。repeater允许添加自定义ItemTemplate,而MultiView提供了在不同视图之间切换的简单方法。在中继器的ItemDataBound事件处理程序中,可以设置多视图的正确视图
中继器的标记
视图1-
视图2-
代码隐藏
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!IsPostBack)
{
var items=新列表();
添加(新的MyDataItem(){Name=“Item1”,Category=“Cat1”});
添加(新的MyDataItem(){Name=“Item2”,Category=“Cat2”});
添加(新的MyDataItem(){Name=“Item3”,Category=“Cat1”});
添加(新的MyDataItem(){Name=“Item4”,Category=“Cat2”});
添加(新的MyDataItem(){Name=“Item5”,Category=“Cat1”});
rpt.DataSource=项目;
rpt.DataBind();
}
}
受保护的void rpt_ItemDataBound(对象发送方,RepeaterItemEventArgs e)
{
如果(e.Item.ItemType==ListItemType.Item
||e.Item.ItemType==ListItemType.AlternatingItem)
{
var multiView=e.Item.FindControl(“multiView”)作为multiView;
如果(多视图!=null)
multiView.ActiveViewIndex=
((MyDataItem)e.Item.DataItem)。类别==“Cat1”?0:1;
}
}
公共类MyDataItem
{
公共字符串名称{get;set;}
公共字符串类别{get;set;}
}
你所说的根本不同是什么意思?不同的CSS类,根据类别更改某些控件的可见性
?您使用ASP.NET WebForms还是MVC?ASP.NET WebForms。根本不同的Html。我编辑了我的问题来澄清。假设有5个类别。您认为为每种类型添加用户控件可以吗?然后做一个switch语句来决定ActiveViewIndex?@Skúli:是的,如果用户控件比示例中更复杂,那么用户控件是一个很好的方法来区分不同的布局。否则,视图标记会使ItemTemplate膨胀并降低可读性。切换是决定采用哪种视图的简单方法。只是别忘了在添加新类别时扩展它。
public class MyBusinessObject
{
public string Value1{ get; set; };
public string Value2{ get; set; };
public string Value3{ get; set; };
public CategoryEnum Category{ get; set; };
}
<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; }
}