You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:45:57