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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:54:02