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

时间:2017-08-15 21:37:09

标签: c# asp.net-mvc model-binding

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

我试图克服的障碍是:

  1. 如何对UnderlyingEntity属性进行往返序列化/反序列化。我可以在视图中轻松地序列化它,但是如何在发布表单时将其恢复为原始类型?我想我需要一个ModelBinder或ValueProvider,但我不确定从哪里开始。
  2. 我还想加密/解密(编辑或散列)该值,因此它不会以纯文本形式隐藏在隐藏字段中。如果它是纯文本的,那么用户通过开发人员工具基本上可以编辑它。我想如果我解决#1,我可以和它一起做。

1 个答案:

答案 0 :(得分:1)

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

最佳做法是以下步骤:

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

要了解详情,请转到此链接=> 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