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

ASP.NET Core MVC 3.1表单POST时模型列表始终为空求助

问题解决方法

核心原因

  1. 表单嵌套违规:HTML规范不允许<form>标签嵌套,你视图中外层的form会导致内层表单提交行为异常。
  2. 字段绑定格式错误:用ViewBag传递模型时,asp-for="@items[k].Result"生成的name属性是items[0].Result这类格式,而ASP.NET MVC绑定List<ReportModel>需要[0].Result、[1].Result这种直接带索引的命名,导致后台无法解析表单数据。
  3. 强类型绑定缺失:依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:37:15