Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显示具有完全不同的html表示形式的项目列表_C#_Asp.net_Webforms - Fatal编程技术网

C# 显示具有完全不同的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事件处理程序中,可以设置多视图的正确视图

假设我有一个要在html中显示的项目列表。例如,它可以是:

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; }
}