asp.net mvc使用viewmodel进行创建和编辑

时间:2011-12-13 10:05:43

标签: asp.net-mvc viewmodel automapper edit

想要在我的视图中摆脱ViewBag,所以我对viewmodels进行了一些研究。 我喜欢用它来演示的想法,这里没有问题。 但我没有意识到使用viewmodels进行更新的最佳方法是什么。

首先,为什么我不能将我的EF实体与[MetadataType(typeof(User_Validation))]一起使用?

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

其中User是EntityObject。

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

另外,在POST之后更新操作对象的最佳方法是什么(不使用tryupdatemodel,因为here而且不仅仅是人们反对这种方法)。我试过使用ApplyCurrentValues但是如果有一些复杂的更新逻辑与多对多关系,例如,我得到一些巨大的EF错误。这就是为什么我需要手动设置我从DB获取的EntityObject的字段,其中包含的值将起作用。像这样的Smth:

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

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

所以,如果我使用平面视图模型从表单中获取值,而AutoMapper将值设置为我的entityobject,那么它是处理更新的最正确方法还是可以自动化更多?

1 个答案:

答案 0 :(得分:1)

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

以下是我遵循的做法:

  1. 所有实体类都在一个文件夹“Entity”下进行了分组。您还可以选择单独的库项目。
  2. 每个实体都有一个对应的ViewModel类,其后缀为Model(例如,对于Profile实体,有ProfileModel类)。
  3. 对于嵌套实体,有相应的嵌套ViewModel类。
  4. AutoMapper用于模型到实体,反之亦然。这里,automapper负责嵌套实体。如果是复杂的更新,而不是依赖于AutoMapper,我会亲自控制控制器。
  5. 通过我的域对象和视图模型之间的健康分离,完美地工作。