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

为何@foreach遍历对象集合失效而@for语句可行?

ASP.NET Core Razor页面表单绑定:foreach与for循环的差异问题

在ASP.NET Core Razor页面开发中,使用@foreach遍历集合生成表单元素时:

@foreach (var contact in Model.Contacts)
{
    <div class="row">
        <div class="col-sm">
            <input asp-for="@contact.FirstName" class="form-control" />
        </div>
    </div>
}

提交表单后,OnPost方法中Contacts集合计数为0;但使用@for循环生成的表单:

@for (var i = 0; i < Model.Contacts.Count; i++)
{
    <div class="row" style="font-style:italic">
        <div class="col-sm">
            <input name="[@i].FirstName" value="@Model.Contacts[i].FirstName" class="form-control" style="font-style:italic" />
        </div>
    </div>
}

提交后却能正确获取集合数据。以下是两者差异的原因:


核心原因:模型绑定器的集合识别规则

ASP.NET Core的模型绑定器要正确绑定集合类型,要求表单元素的name属性必须遵循**[索引].属性名**的格式(例如[0].FirstName)。只有这样,绑定器才能将提交的值对应到集合的对应位置。

@foreach失效的原因

使用@foreach遍历Model.Contacts时,asp-for="@contact.FirstName"生成的name属性为contact.FirstName(无索引标识)。因为foreach遍历的是单个独立的contact对象,Razor无法识别它属于Contacts集合的具体位置,所以生成的表单name不符合绑定器要求的集合命名规范。提交后,绑定器无法将零散的contact.FirstName值映射到Model.Contacts集合,最终导致集合计数为0。

@for循环生效的原因

@for循环通过索引i访问集合元素,手动指定的name="[@i].FirstName"完全符合模型绑定器的集合命名格式。提交表单后,绑定器能根据索引值,将每个输入框的值对应到Contacts[i]的FirstName属性,从而正确识别并填充整个集合。


内容的提问来源于stack exchange,提问作者Mark C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:42:42