嵌套Repeater数据源绑定异常:List实现IEnumerable仍报错
ASP.NET嵌套Repeater数据源异常问题解决
问题背景
在ASP.NET中实现嵌套Repeater展示层级数据,定义了如下ItemData类:
Public Class ItemData Public Property ID() As Integer ' 其他属性省略 Public Property KitItems() As List(Of ItemData) End Class
对应的ASPX标记代码如下:
<asp:Repeater ID="itemRepeater" Runat="server"> <HeaderTemplate> <table id="wrapper" cellspacing="0" cellpadding="0"> <tr class="legend"> <th>Item No</th> <th>Units/Pkg</th> <th>Cart Qty</th> <th>Total Units</th> <th>Size</th> <th>Color</th> <th>Unit Price</th> <th>Total</th> </tr> </HeaderTemplate> <ItemTemplate> <tr class="product"> <td><%# DataBinder.Eval(Container.DataItem, "ItemNo") %></td> <td><%# DataBinder.Eval(Container.DataItem, "Units") %></td> <td><%# DataBinder.Eval(Container.DataItem, "Qty") %></td> <td><%#DataBinder.Eval(Container.DataItem, "TotalUnits")%></td> <td><%# DataBinder.Eval(Container.DataItem, "Size") %></td> <td><%# DataBinder.Eval(Container.DataItem, "Color") %></td> <td><asp:Literal ID="ltlCost" runat="server" /></td> <td><asp:Literal ID="ltlTotalCost" runat="server" /></td> </tr> <asp:Repeater runat="server" DataSource='<%# Eval("KitItems") %>'> <ItemTemplate><%# Eval("Name") %></ItemTemplate> <SeparatorTemplate>,</SeparatorTemplate> </asp:Repeater> </ItemTemplate> <FooterTemplate> </FooterTemplate> </asp:Repeater>
在绑定子Repeater的DataSource='<%# Eval("KitItems") %>'这一行,抛出如下异常:
System.ArgumentException: 'An invalid data source is being used for . A valid data source must implement either IListSource or IEnumerable.'
明明List<T>实现了IEnumerable,却触发该异常,以下是问题原因和解决方法。
问题原因
核心问题在于**Eval方法返回的是Object类型**,ASP.NET数据绑定控件无法自动识别这个装箱后的对象是否实现了IEnumerable接口,因此判定数据源无效。此外,如果KitItems属性为null,也会触发该异常,因为null不满足IListSource或IEnumerable的要求。
解决方法
1. 显式强转类型
将Eval返回的对象强制转换为List(Of ItemData)或IEnumerable,让控件明确识别数据源类型:
<asp:Repeater runat="server" DataSource='<%# CType(Eval("KitItems"), List(Of ItemData)) %>'>
2. 使用DataBinder.GetPropertyValue
通过DataBinder.GetPropertyValue直接获取强类型属性值,避免装箱带来的识别问题:
<asp:Repeater runat="server" DataSource='<%# DataBinder.GetPropertyValue(Container.DataItem, "KitItems") %>'>
3. 处理空值场景
为避免KitItems为null时触发异常,可添加空值判断,返回空集合作为兜底:
<asp:Repeater runat="server" DataSource='<%# If(Eval("KitItems") IsNot Nothing, CType(Eval("KitItems"), List(Of ItemData)), New List(Of ItemData)) %>'>
内容的提问来源于stack exchange,提问作者David Shochet
相关产品推荐
相关产品推荐

