You need to enable JavaScript to run this app. MVC foreach循环中逐行表单 提交后控制器绑定Guid参数为空问题
优惠活动
大模型
产品
解决方案
定价
更多

MVC foreach循环中逐行表单 提交后控制器绑定Guid参数为空问题

绑定失败的核心原因

问题本质是Razor Tag Helper的asp-for生成的表单字段名和ASP.NET MVC模型绑定规则不匹配,导致所有提交的字段值都无法被正确映射到Action参数上:

  • 你在循环内写asp-for="@item.Id"本身写法就有问题:asp-for是内置Tag Helper的表达式属性,本身就支持内联模型表达式,不需要额外加@前缀。加了@之后,Razor会直接把运行时计算得到的item.Id的Guid值传给Tag Helper,而非将"item.Id"作为可解析的表达式处理,最终生成的input标签的name属性完全不符合模型绑定的要求。
  • 就算去掉多余的@写成asp-for="item.Id",Razor的表达式解析器也无法识别这个item是视图Model(IList<TransferLineUpdateResponse>)里的列表项,会直接把完整的表达式路径作为表单字段名,最终生成的字段名格式是item.Id、item.TransferHeaderId、item.ToLocationId。
  • 你对应的Action参数是TransferLineUpdateResponse update,模型绑定器会直接在提交的表单字段里查找和属性名完全一致的键(也就是Id、TransferHeaderId、Item、ToLocationId)。但实际提交的字段名带了多余的item.前缀,自然匹配失败,所有Guid类型的属性最终都会被填充为默认的空Guid。
可直接落地的修复方案

针对逐记录独立表单的场景,不需要依赖asp-for自动生成字段名,手动指定表单字段的name属性,确保字段名和Action的参数属性完全对应即可:

@foreach (var item in Model)
{
    <form method="post" class="form-inline">
        <div class="form-group">
            <input type="hidden" name="Id" value="@item.Id" class="form-control" />
            <input type="hidden" name="TransferHeaderId" value="@item.TransferHeaderId" class="form-control" />
        </div>
        <div class="form-group">
            <label>@Html.DisplayNameFor(m => item.Item)</label>
            <input name="Item" value="@item.Item" readonly class="form-control" />
        </div>
        <div class="form-group">
            <label>@Html.DisplayNameFor(m => item.ToLocationId)</label>
            <select class="form-control" name="ToLocationId" asp-items="ViewBag.ToLocations">
                <option value="">请选择目标位置</option>
            </select>
        </div>
        <div class="form-group">
            <input type="submit" name="Status" value="Accepted" class="btn btn-success" /> |
            <input type="submit" name="Status" value="Rejected" class="btn btn-danger" />
        </div>
    </form>
}

修复后的额外注意事项:

  • 原代码中用的asp-route-status="Accepted"只会把状态值拼接到请求的URL路由/查询字符串里,并不会把值带到表单请求体中。建议按照示例把两个提交按钮设置为相同的name、不同的value,点击哪个按钮就会把对应的值提交到请求体里,只需在Action中新增对应的string status参数就能接收状态值。
  • 因为每条记录都是独立表单,不需要像批量编辑的多列表单那样给字段加索引前缀,只要单个表单内的字段名和Action的复杂类型参数属性名完全一致,模型绑定器就能正确读取到值。

内容的提问来源于stack exchange,提问作者Danijel Boksan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 14:45:07