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

ASP.NET Core 3.1传递ViewModel到View后表单输入内容未清空如何解决

问题根因及解决办法

1. 提交后表单输入框不清空、隐藏域显示旧值0的问题

ASP.NET Core的模型绑定系统会优先从ModelState字典中读取本次请求提交的旧值渲染表单控件,优先级高于你返回的ViewModel属性值。你提交表单后ModelState中仍然保留了提交时的所有字段值,所以哪怕你返回了新的ViewModel,输入框还是会显示之前提交的内容,隐藏域的PK_Id也会优先显示提交时的0,而不是新增后生成的新ID。

解决方法:在返回视图之前调用ModelState.Clear()清空模型状态字典,让视图直接读取你返回的ViewModel的最新值。修改控制器update方法代码:

public IActionResult update(Surveyor surveyor)
{
    if (ModelState.IsValid)
    {
        if (surveyor.PK_Id == 0)
        {
             surveyor = addSurveyor(surveyor);
        }
        else
        {
             surveyor = updateSurveyor(surveyor);
        }
    }
    SurveyorViewModel surveyorViewModel = PopulateLists();
    surveyorViewModel.Surveyor = surveyor;
    // 新增该行,清空ModelState存储的旧提交值
    ModelState.Clear();
    return View("Surveyor", surveyorViewModel);
}

修改完成后把你手动改写的隐藏域代码改回原生TagHelper写法即可:

<input type="hidden" asp-for="Surveyor.PK_Id" />

此时隐藏域会自动读取ViewModel里的最新ID值,不需要手动指定value和name属性。

2. 手动修改隐藏域后值无法传递到控制器的问题

你手动写的隐藏域name="PK_Id"不符合模型绑定的命名规则:
原生asp-for="Surveyor.PK_Id"生成的隐藏域name属性为Surveyor.PK_Id,你页面上其他输入框通过asp-for生成的name属性也都是Surveyor.xxx格式,手动修改为name="PK_Id"后,字段名和模型绑定的前缀规则不匹配,控制器自然接收不到该值。按照上述第一个问题的方法修改后,不需要再手动编写隐藏域代码,用原生TagHelper即可正常绑定传值。

附加需求:操作完成后清空输入框

如果你希望新增/修改操作成功后清空所有输入框,直接将surveyorViewModel.Surveyor赋值为新的空Surveyor对象即可:

surveyorViewModel.Surveyor = new Surveyor();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:09:00