ASP.NET Core MVC中return View("viewname",model)传修改后模型视图未渲染如何解决
问题原因
使用asp-for属性渲染表单控件时,ASP.NET Core MVC会优先读取ModelState字典中存储的用户提交值,其次才会读取你传入视图的Model对象的属性值。你提交表单后,用户输入的Steven已经被自动填充到ModelState中,哪怕你后续修改了Model的Name属性,渲染时还是会优先使用ModelState里的旧值,所以会出现修改不生效的情况。
解决方案
有两种常用的处理方式可选:
- 清空全部ModelState
在修改Model属性前调用ModelState.Clear(),清除所有存储的提交值,渲染时就会直接读取修改后的Model属性,适合需要修改多个字段的场景。
修改后的Index2代码示例:[HttpPost] public IActionResult Index2(Test test) { ModelState.Clear(); test.Name = "Name999"; return View("Index", test); } - 仅移除指定字段的ModelState条目
如果你只需要修改个别字段,不需要清空全部ModelState,只移除对应字段的存储值即可,性能更好,还能保留其他字段的验证信息。
对应代码示例:[HttpPost] public IActionResult Index2(Test test) { ModelState.Remove(nameof(test.Name)); test.Name = "Name999"; return View("Index", test); }
补充说明
这个默认优先级是为表单验证失败回显场景设计的,方便保留用户已输入的内容,避免重复填写。当你业务需要覆盖用户输入的内容时,手动清除对应ModelState条目即可。
内容的提问来源于stack exchange,提问作者Xie Steven
相关产品推荐
相关产品推荐

