【问题标题】:asp.net mvc using viewmodel for create and editasp.net mvc 使用 viewmodel 创建和编辑
【发布时间】:2011-12-13 10:05:42
【问题描述】:

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

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

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

其中 User 是 EntityObject。

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

另外,在 POST 之后更新对象的最佳方法是什么(不使用 tryupdatemodel,因为here 不仅人们反对这种方法)。我尝试使用 ApplyCurrentValues,但如果存在一些复杂的多对多关系更新逻辑,例如,我会收到一些巨大的 EF 错误。这就是为什么我需要手动设置我从 DB 获得的 EntityObject 的字段,并使用能够起作用的值。像这样的:

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

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

所以,如果我使用平面视图模型从表单获取值并使用 AutoMapper 为我的实体对象设置值,这将是处理更新的最正确方法还是可以进一步自动化?

【问题讨论】:

    标签: asp.net-mvc viewmodel automapper edit


    【解决方案1】:

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

    这是我遵循的做法:

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

    【讨论】:

    • 那么验证呢。如果我使用 ef 对象,我会在一个地方添加属性,并且每次都会在不同的地方进行验证。但如果我使用不同的视图模型,我是否必须重复验证逻辑?
    • 我复制了 ViewModel 类的注释。这样客户端/服务器/编程操作都会得到验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多