ASP.NET MVC Post提交时模型非编辑字段值为null该如何解决?
问题原因
表单提交时只会把<form>标签内的**可提交表单元素(输入框、下拉框、隐藏域等)**的内容带入请求参数,你直接用@Model.Customer渲染的是普通纯文本,不属于表单提交元素,所以Post到后端时MVC的模型绑定找不到对应参数,就会给Customer字段赋值为null。
解决方案1:添加隐藏域保留值(改造成本最低)
你不需要将Customer渲染为可编辑文本框,只需要在表单内部添加对应隐藏域即可,隐藏域不会在页面展示,不影响纯文本展示的美观要求,同时提交时会自动带上Customer的值。
注意也要补充主键ID的隐藏域,否则模型绑定会丢失主键,导致更新逻辑出错。
修改后的视图核心代码:
@using (Html.BeginForm()) { @Html.AntiForgeryToken() <!-- 新增隐藏域保存只读字段和主键 --> @Html.HiddenFor(m => m.ID) @Html.HiddenFor(m => m.Customer) <table style="width: 100%"> <tr> <td> <table style="width:800px"> <tr> <!-- 保持纯文本展示不变 --> <td>@Model.Customer</td> <td> @Html.TextBoxFor(m => m.Address) </td> </table> <td> <input type="submit" value="Save" class="btn btn-default" /> </td> </tr> </table> }
解决方案2:后端重新加载只读字段(安全性更高)
如果Customer属于不允许用户篡改的敏感字段,可以选择不在前端传递,在Post接口中先根据ID查询数据库原有数据,仅覆盖需要更新的可编辑字段即可:
[HttpPost] public ActionResult CreateExisting(int id, LO lo) { try { // 查询已有数据保留只读字段 var existingLo = db.LOes.Find(id); // 仅更新允许编辑的字段 existingLo.Address = lo.Address; db.SaveChanges(); return RedirectToAction("Index", "LO"); } catch { return RedirectToAction("Error", new { id = id }); } }
这种方式不需要在视图加Customer的隐藏域,避免了前端数据被恶意篡改的风险。
内容的提问来源于stack exchange,提问作者Baize
相关产品推荐
相关产品推荐

