.NET5中@Html.HiddenFor绑定RowVersion缓存旧值问题咨询
核心原因
这是ASP.NET Core(.NET5属于ASP.NET Core范畴)与.NET Framework中HTML Helper的行为差异导致的:
- 值读取优先级不同
.NET Core 中的@Html.HiddenFor等强类型HTML Helper渲染值时,会优先从ModelState字典中读取用户提交的原始值,而非直接读取当前视图模型的属性值。这个设计的初衷是表单验证失败回显时,优先保留用户刚刚输入的内容,避免丢失未保存的输入。
你在并发冲突处理逻辑中,仅将数据库读取到的最新RowVersion更新到了视图模型的属性上,没有同步修改或删除ModelState中存储的用户首次提交的旧RowVersion值,因此HiddenFor始终渲染的是首次提交的旧值。
而.NET Framework 中的HTML Helper优先级相反,会优先读取更新后的视图模型属性值,所以两种写法在.NET Framework下没有问题。 - 手动写法绕开了ModelState逻辑
你手动编写hidden输入框时,直接从@Model.RowVersion读取最新值并显式转成Base64字符串,完全绕开了ModelState的读取逻辑,所以可以正常拿到更新后的值。
解决方法
如果你想继续使用HiddenFor写法,只需在更新视图模型的RowVersion属性后,添加一行代码移除ModelState中对应的条目即可:
controller.ModelState.Remove("RowVersion");
移除后HiddenFor会自动读取视图模型的最新属性值,输出正确的Base64编码的行版本。
内容的提问来源于stack exchange,提问作者Jan Jurníček
相关产品推荐
相关产品推荐

