asp.net-mvc - 如何仅更新 MVC 中已更改的模型属性?

标签 asp.net-mvc model-view-controller entity-framework

我正在开发一个允许编辑记录的网络应用程序。两个用户有可能同时在同一屏幕上工作,如果他们都单击“保存”,我希望将造成的损害降到最低。

如果用户 1 请求该页面,然后更改地址、电话和联系方式,但在单击“保存”之前,用户 2 请求同一页面。

然后,User1 单击“保存”,并使用 TryUpdateModel() 更新整个模型,如果 User2 只是将一些详细信息附加到 Notes 字段,则当他保存时,TryUpdateModel() 方法将使用旧详细信息覆盖 User1 保存的新详细信息.

我考虑过将所有模型属性的原始值存储在隐藏的表单字段中,然后编写自定义的 TryUpdateModel 来仅更新已更改的属性,但这感觉有点太像我们所有的 Viewstate我很高兴能够离开并转向 MVC。

是否有我不知道的处理此问题的模式?

你会如何处理?

更新:为了回答下面的评论,我正在使用 Entity Framework 。

安东尼

最佳答案

除非您对这种情况下发生的情况有任何特殊要求(例如锁定记录,这当然需要一些功能来在用户决定不进行更改的情况下撤消锁定),否则我建议使用正常的方法是乐观锁:

您执行的每次更新都应检查记录是否同时发生更改。

所以:

  1. 在记录中放置一个整数“版本”属性或 guid/rowversion。
  2. 确保它包含在 html 的隐藏字段中,因此会随任何提交一起返回;
  3. 执行更新时,请确保(数据库)记录的版本/guid/rowversion 仍然与隐藏字段中的值匹配[如果您执行更新,则在执行更新时将“版本”整数加 1决定采用手动方法。]

类似的方法显然是在记录上使用日期/时间戳,但不要这样做,因为在系统时钟的精度范围内,它是有缺陷的。

[我建议您在其他地方找到整个方法的更完整的解释。当然,如果您要通过 google 搜索有关 NHibernate 版本功能的信息...]

关于asp.net-mvc - 如何仅更新 MVC 中已更改的模型属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878245/

相关文章:

c# - FluentValidation:检查两个字段之一是否为空

java - MVC 模式在 Java 中启用事件按钮

mysql - 带有 MySQL 的 Entity Framework 6

asp.net-mvc - 将验证消息添加到 Entity Framework 生成的 MVC 类

model-view-controller - spring mvc @requestmapping 最佳实践

c# - 使用Entity Framework 4.0时如何更新不同表的相关条目?

c# - 当 View 上的 htmlAttribute 名称更改时,模型绑定(bind)不起作用

c# - 如何从MVC中的下拉列表中获取所选项目

jquery - 使用 jQuery 设置 Html.TextBoxFor 值不会反射(reflect)在模型 POST 中

java - 使用 MVC 时如何仅更新列表中的某些项目?