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
相关产品推荐
相关产品推荐

