为何@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
相关产品推荐
相关产品推荐

