ASP.NET Core中使用IEnumerable<T>和foreach提交复选框参数到控制器失效
参数传递失效的原因
ASP.NET Core 的模型绑定系统对集合类型的参数绑定有固定的格式要求:表单提交的字段名必须携带索引标识,比如[0].ProductKey、[0].IsAvailable、[1].ProductKey这种格式,绑定系统才能将字段映射到集合的对应元素中。
你当前使用foreach遍历生成表单元素,最终渲染出来的字段名都是item.IsAvailable、item.ProductKey,没有索引信息,模型绑定无法识别这些字段属于集合中的哪个元素,所以最终接收到的productList是空集合。
解决方法
推荐使用原生支持的for循环替换foreach,步骤如下:
- 首先修改视图的模型声明,将
IEnumerable<Products>改为支持索引访问的IList<Products>:
@model IList<Products>
- 替换循环逻辑,使用带索引的
for循环生成表单元素,不需要手动指定checked、value属性,asp-for标签助手会自动完成值绑定:
<form asp-controller="Product" asp-action="FindIfProductInStock"> <div class="row"> @for (int i = 0; i < Model.Count; i++) { <div class="form-group"> <label class="label-checkbox"> <input asp-for="@Model[i].IsAvailable" type="checkbox" /> <span> @Html.DisplayFor(m => m[i].ProductName) </span> </label> </div> <div class="form-group"> <input asp-for="@Model[i].ProductKey" type="hidden" /> </div> } </div> <div class="form-group"> <input type="submit" value="Update" class="btn btn-primary" /> </div> </form>
修改完成后控制器返回视图前将IEnumerable类型的模型转为List类型即可,提交表单后控制器就能正常接收到完整的productList集合数据。
内容的提问来源于stack exchange,提问作者Cenderze
相关产品推荐
相关产品推荐

