ASP.NET MVC 中 ViewModel 属性 的往返转换

Round trip transformation of ViewModel property in ASP.NET MVC

我正在开发一个 ASP.NET MVC 应用程序,我正在尝试弄清楚如何支持乐观并发。我现在正在使用的方法是让 Web 应用程序检索一个实体的实例(只是一个 POCO),并从中构建一个 ViewModel。 ViewModel 将包含一个 object UnderlyingEntity 属性 来保存实体本身的实例。我可以将 UnderlyingEntity 属性 放在视图的隐藏字段中,然后在提交视图时,将更改应用到 UnderlyingEntity,然后将其发送以进行更新。因为我在隐藏字段中保留了我的原始实体实例,所以当我保存时我有原始时间戳用于并发检查。

我试图克服的障碍是:

  1. 如何进行 serialization/deserialization 的 UnderlyingEntity 属性 往返。我可以很容易地在视图中对其进行序列化,但是如何在发布表单时将其恢复为原始类型?我想我需要一个 ModelBinder 或 ValueProvider,但我不确定从哪里开始。
  2. 我还想 encrypt/decrypt(编辑:或散列)该值,这样它就不会以纯文本形式位于隐藏字段中。如果是纯文本,用户基本上可以通过开发人员工具对其进行编辑。我想如果我解决了#1,我可以一起做这个。

没有。这不是如何处理 EF 中的并发。

最佳做法是以下步骤:

  • 在您的实体上添加行版本或时间戳类型的新 属性。 EF 将使用此列在更新时将行的版本检查到数据库中。如果该值与存储在数据库中的当前值不同,则会抛出异常。
  • 在您的 Razor wiew 中,只需将行版本的值存储到一个隐藏字段中。 (它将生成一个 Base 64 字符串,就像在评论中发现的 Stephen Muecke 一样)
  • 当用户将编辑后的数据发送回您的应用程序时,您将视图模型映射到您的实体。
  • 保存数据时 EF 会抛出异常DbUpdateConcurrencyException,捕获该异常。在 catch 块中,你可以做你想做的事。

要了解更多信息,请转到此 link => https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application