【问题标题】:Map Model to View Model将模型映射到视图模型
【发布时间】:2012-04-17 18:23:41
【问题描述】:

我正在查看一个指南,上面写着“应该使用自动映射器将模型映射到视图模型”。为什么会有这样的指导?

为什么不让模型成为视图模型的属性?例如,我可以使用这样的视图模型对联系人列表进行分页:

class ContactListPaginatedViewModel {
    public Contact myContact;  //the model object
    public PageInfo pageInfo;
}

即使我需要回发来更新联系信息 - 模型绑定器也会很容易地解决这个问题。如果我需要从绑定中省略某些字段/属性(通过回发或其他方式),那么我可以简单地将 Bind 注释与“包含/排除”一起使用。

我是否遗漏了一些更大的问题,表明手动映射过程(模型的所有属性都在视图模型上复制)是可取的?

我能想到的最好的结果是模型可能有几十个视图(或视图模型)不需要的属性......但即使在这种情况下,上述指导仍然没有意义。

见解?

【问题讨论】:

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


    【解决方案1】:

    通常,如果您有一个 dto 类,最好的做法是提供一个仅包含模型所需属性的视图模型。这意味着您实际上只为您实际使用的内容指定属性,例如我有一个包含 20 个字段的 Client 对象,我需要 IdFullName,包含整个 @ 987654324@ 模型中的对象,最好只指定该模型中所需的属性。

    另外,从架构的角度来看,您真的希望将您的 DTO 类公开给视图吗?在大多数情况下,某种服务层用作 DTO 类和视图本身之间的临时通信点,这反过来会为您填充视图模型。

    【讨论】:

      【解决方案2】:

      因为将数据实体直接发送到视图是不好的做法。造成这种情况的原因有很多,包括安全原因。但也有更实际的原因,例如能够应用视图模型属性(当您的实体自动生成时您无法做到这一点,尽管有一些方法可以解决这个问题,例如使用伙伴类)。

      一般。您需要一个特定于您的视图的视图模型。此视图模型应映射到您的业务对象。你的业务对象和你的实体对象是否有区别更多的是一个灰色地带,但是视图模型和业务模型之间应该有明确的区别。

      【讨论】:

        【解决方案3】:

        我几乎总是在我的 ViewModel 中保留一个模型引用。如果我需要一些额外的属性,我只需将它们添加到我的视图模型中。海事组织很好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多