ASP.NET Core MVC 3.1表单POST时模型列表始终为空求助
问题解决方法
核心原因
- 表单嵌套违规:HTML规范不允许
<form>标签嵌套,你视图中外层的form会导致内层表单提交行为异常。 - 字段绑定格式错误:用ViewBag传递模型时,
asp-for="@items[k].Result"生成的name属性是items[0].Result这类格式,而ASP.NET MVC绑定List<ReportModel>需要[0].Result、[1].Result这种直接带索引的命名,导致后台无法解析表单数据。 - 强类型绑定缺失:依赖ViewBag而非强类型视图,破坏了MVC的模型绑定上下文。
具体修复步骤
1. 修正控制器Get方法,使用强类型视图传递模型
[HttpGet] public async Task<IActionResult> Report(int id) { var model = await laboratoryRepository.GetRequests(id); // 直接传递模型给视图,替代ViewBag return View(model); }
2. 修改视图为强类型视图,修复表单结构与字段绑定
在视图顶部添加强类型声明,移除外层form,手动设置字段的name属性为正确的索引格式:
@model List<ReportModel> @{ // 按分类分组 var distinctCategories = Model.DistinctBy(m => m.CategoryName).ToList(); } @foreach (var category in distinctCategories) { var categoryItems = Model.Where(m => m.CategoryName == category.CategoryName).ToList(); <form id="@category.CategoryName.Replace(" ", string.Empty)" asp-action="Report" asp-controller="Laboratory" method="post"> <div class="row g-3"> @for (int k = 0; k < categoryItems.Count; k++) { <!-- 手动设置name属性为[索引].属性名,确保后台能绑定到List --> <input type="hidden" name="[@k].RequestId" value="@categoryItems[k].RequestId" /> <input type="hidden" name="[@k].ServiceName" value="@categoryItems[k].ServiceName" /> <input type="hidden" name="[@k].CategoryName" value="@categoryItems[k].CategoryName" /> <div class="col-md-4 pt-0 pb-0 mb-0 mt-0"> <label class="form-label">@categoryItems[k].ServiceName</label> <input type="text" name="[@k].Result" class="form-control form-control-sm" value="@categoryItems[k].Result" /> <span asp-validation-for="@categoryItems[k].Result" class="small text-danger"></span> </div> } </div> <div class="d-flex justify-content-between mt-3 border-0"> <button type="submit" class="btn btn-sm btn-primary">Save</button> </div> </form> }
3. 调整Post控制器方法(可添加[FromForm]明确绑定方式)
[HttpPost] public async Task<IActionResult> Report([FromForm] List<ReportModel> model) { // 此时model可正常接收表单提交的数据 // 后续业务逻辑处理 }
额外说明
- 前端验证依然有效,
asp-validation-for基于模型特性生成验证规则,不受name属性修改影响。 - 确保模型类属性均为可读写(你的
ReportModel已满足),这是模型绑定的必要前提。
内容的提问来源于stack exchange,提问作者aman girma
相关产品推荐
相关产品推荐

