2011-12-13 23 views
0

想要摆脱ViewBag在我的意见,所以我做了一些关于viewmodels的研究。 我喜欢使用它进行演示的想法,在这里没有问题。 但我不知道什么是使用viewmodels进行更新的最佳方式。asp.net mvc使用viewmodel来创建和编辑

首先,为什么我不应该使用我的EF实体[MetadataType(typeof(User_Validation))]?

public ActionResult Edit(User user) 
{ 
    ... 
} 

其中User是EntityObject。

然后,如果我使用viewmodels它有另一个问题:here人们认为应该使用嵌套viewmodels,但here是另一种观点(他说,“他们不是域模型的包装”)。谁是对的?

另外,什么是POST后更新对象的最佳方式(不使用tryupdatemodel,因为here而不仅仅是人们反对这种方法)。我试图使用ApplyCurrentValues,但是如果有一些复杂的更新逻辑与多对多关系,例如,我会得到一些巨大的EF错误。这就是为什么我需要手动设置我的EntityObject的字段,这些字段是从数据库中获得的,并且具有可行的值。如下所示:

public ActionResult Edit(User user) 
{ 
    if (ModelState.IsValid) 
    { 
     var userToUpdate = usersRepository.Get(user.UserId); 
     userToUpdate.Field1 = user.Field1; 
     ... 
     // save 
    } 
    ... 
} 

其中User是具有验证类的EntityObject。

因此,如果我使用平面viewmodels从窗体获取值和AutoMapper将值设置为我的实体对象将它是处理更新最正确的方式,或者它可以被自动化更多?

回答

1

你在最后一段回答自己。我在我的MVC3 EF Code First项目中使用完全相同的方法。

这里是我遵循的做法:

  1. 所有实体类的一个文件夹“实体”下杵。你也可以选择一个单独的图书馆项目。
  2. 每个实体都有一个对应的ViewModel类,其后缀为Model(例如Profile Profile实体有ProfileModel类)。
  3. 对于嵌套实体,有相应的嵌套ViewModel类。
  4. AutoMapper用于模型到实体,反之亦然转换。这里automapper负责嵌套实体。在更新复杂的情况下,我不是依靠AutoMapper,而是在控制器中亲自处理此事。
  5. 完美地与我的领域对象和视图模型之间的健康分离。
+0

以及验证。如果我使用ef对象,我会在一个地方添加属性,并且验证每次都会在不同的地方发生。但如果我使用不同的viewmodels我将不得不重复验证逻辑? – donRumatta

+0

我复制了ViewModel类的注释。这样客户端/服务器/编程操作都得到验证。 – Prafulla

相关问题