Razor表单提交仅返回单个LanguageModel对象,如何获取完整列表?
问题原因与解决方案
核心问题
你的视图代码中,nr++ 语句被放在了 foreach 循环的外部,导致循环执行过程中 nr 的值始终为0。所有生成的表单字段的name属性都会变成Languages[0].Id、Languages[0].Name这类重复索引的格式,后端模型绑定的时候,后续字段会直接覆盖第一个字段的值,最终只能得到1个LanguageModel对象。
修复后的视图代码
把nr++移到foreach循环内部,确保每次循环后索引值递增:
<div class="GroupContent"> @{ var nr = 0; foreach (var entry in Model.Languages) { <table cellspacing="" cellpadding="0" border="0"> <tr> <td class="Label"> <label for="">language</label> </td> <td class="Field"> <input type="hidden" name="Languages[@nr].Id" value="@entry.Id" /> <input type="hidden" name="Languages[@nr].GlobalTaggingId" value="@entry.GlobalTaggingId" /> <input type="hidden" name="Languages[@nr].LanguageId" value="@entry.LanguageId" /> <div class="input-control text"> <input type="text" name="Languages[@nr].Name" value="@entry.Name" /> </div> </td> </tr> </table> nr++; <!-- 将索引递增移到循环内部 --> } } </div>
更简洁的写法推荐
ASP.NET MVC中针对集合绑定,直接使用for循环代替foreach会更简洁,还能避免索引操作出错:
<div class="GroupContent"> @for (int i = 0; i < Model.Languages.Count; i++) { <table cellspacing="" cellpadding="0" border="0"> <tr> <td class="Label"> <label for="">language</label> </td> <td class="Field"> <input type="hidden" name="Languages[@i].Id" value="@Model.Languages[i].Id" /> <input type="hidden" name="Languages[@i].GlobalTaggingId" value="@Model.Languages[i].GlobalTaggingId" /> <input type="hidden" name="Languages[@i].LanguageId" value="@Model.Languages[i].LanguageId" /> <div class="input-control text"> <input type="text" name="Languages[@i].Name" value="@Model.Languages[i].Name" /> </div> </td> </tr> </table> } </div>
内容的提问来源于stack exchange,提问作者inno
相关产品推荐
相关产品推荐

