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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:18:02