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

.NET Core非MVC Web应用无法提交IEnumerable数据求助

解决Razor Pages中IEnumerable集合提交为空的问题

核心问题分析

你遇到的问题根源在于模型绑定的格式要求:ASP.NET Core(包括Razor Pages)的模型绑定器需要集合元素的表单控件名称遵循集合名[索引].属性名的格式,才能识别并填充集合。而你当前的代码存在两个关键错误:

  1. 使用IEnumerable<T>作为绑定属性类型:它是只读序列,不支持索引访问,模型绑定器无法创建实例并填充元素。
  2. 手动设置name="@i":这会将整个对象的ToString结果作为控件名称,完全不符合绑定要求;同时asp-for="@i.SALES_ORD_NO"生成的名称也只是单个属性名(如SALES_ORD_NO),没有关联到集合的索引路径。

解决方案

步骤1:修改后端属性类型

将IEnumerable<NpcpAllFields>改为List<NpcpAllFields>,因为List支持索引访问和修改,满足模型绑定的要求:

[BindProperty]
public List<NpcpAllFields> NpcpAllFields { get; set; }

步骤2:修正前端循环的控件绑定

选择以下两种方式之一,确保生成正确的控件名称:

方式1:带索引的foreach循环

通过Enumerable.Select为每个元素附加索引,让asp-for生成正确的绑定路径:

<form asp-page-handler="SaveData" method="post">
    <button type="submit" class="btn btn-primary" id="checkBtn">Submit</button><br />
    <table class="table">
        <tr>
            <th>Sales Order Number</th>
            <th>Sales Order Line</th>
            <th>Is NPC</th>
        </tr>
        @foreach (var item in Model.NpcpAllFields.Select((field, index) => new { field, index }))
        {
            <tr>
                <td>
                    <input class="form-control" asp-for="NpcpAllFields[@item.index].SALES_ORD_NO" />
                </td>
                <td>
                    <input class="form-control" asp-for="NpcpAllFields[@item.index].SALES_ORD_LN_NO" />
                </td>
                <td>
                    <input class="form-control" asp-for="NpcpAllFields[@item.index].IS_A_NEW_PART" />
                </td>
            </tr>
        }
    </table>
</form>
方式2:for循环(修正原问题)

如果你之前用for循环出现异常,大概率是因为原集合是IEnumerable无法通过索引访问。改为List后,直接使用for循环即可正常工作:

<form asp-page-handler="SaveData" method="post">
    <button type="submit" class="btn btn-primary" id="checkBtn">Submit</button><br />
    <table class="table">
        <tr>
            <th>Sales Order Number</th>
            <th>Sales Order Line</th>
            <th>Is NPC</th>
        </tr>
        @for (int i = 0; i < Model.NpcpAllFields.Count; i++)
        {
            <tr>
                <td>
                    <input class="form-control" asp-for="NpcpAllFields[i].SALES_ORD_NO" />
                </td>
                <td>
                    <input class="form-control" asp-for="NpcpAllFields[i].SALES_ORD_LN_NO" />
                </td>
                <td>
                    <input class="form-control" asp-for="NpcpAllFields[i].IS_A_NEW_PART" />
                </td>
            </tr>
        }
    </table>
</form>

关键说明

  • 不要手动设置name属性:asp-for标签助手会自动生成符合模型绑定要求的name和id,手动修改会破坏绑定逻辑。
  • 集合类型选择:Razor Pages中绑定集合优先使用List<T>、T[]等支持索引访问的类型,避免使用IEnumerable<T>作为绑定属性。

内容的提问来源于stack exchange,提问作者Crazy Cat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:13:15