ASP.NET Core Input Tag Helper 取值异常:未绑定模型新值显示旧提交数据
问题原因
这是ASP.NET Core的默认设计逻辑:当Action接收到表单提交的请求时,系统会自动将所有提交的字段值存入ModelState字典中。Input Tag Helper渲染控件时优先读取ModelState中的同名字段值,仅当ModelState中不存在对应键值时,才会读取你传入的ViewModel属性值。
对应你遇到的场景:
- 提交的
MyForm参数包含Url字段,ModelState中已存储了提交的旧Url值,Tag Helper直接使用了该旧值,忽略了你在ViewModel中设置的新值 SellerName字段在提交的表单中没有对应值,且你的ViewModel为该字段添加了[Required]校验注解,请求无对应值会触发校验失败,ModelState中该字段对应的值为空,因此渲染后控件值为空
解决方案
你可以根据实际场景选择以下任意一种方案解决:
- 方案1:清空全部ModelState
在返回视图前调用ModelState.Clear()清空所有ModelState记录,Tag Helper会直接读取ViewModel的属性值,示例代码如下:
public IActionResult AddLinkWizardSecond(MyForm form) { var model = new MyViewModel() { Url = "https://anotherShop.com/index.html", SellerName = "test user 123", }; ModelState.Clear(); return PartialView("myView", model); }
- 方案2:仅清空指定字段的ModelState记录
如果你需要保留其他字段的ModelState校验状态,可以单独移除指定字段的记录:
ModelState.Remove(nameof(MyViewModel.Url)); ModelState.Remove(nameof(MyViewModel.SellerName));
- 方案3:手动覆盖指定字段的ModelState值
如果需要保留ModelState的校验状态,仅修改指定字段的取值,可以直接设置对应字段的ValueProviderResult:
ModelState.SetModelValue(nameof(MyViewModel.Url), new ValueProviderResult(model.Url)); ModelState.SetModelValue(nameof(MyViewModel.SellerName), new ValueProviderResult(model.SellerName));
内容的提问来源于stack exchange,提问作者Zoltan Hernyak
相关产品推荐
相关产品推荐

