地图模型查看模型

时间:2012-04-17 18:23:42

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

我正在寻找一条指南,上面写着“应该使用automapper将模型映射到视图模型”。为何如此指导?

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

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

即使我需要回复以更新联系信息 - 模型绑定器也能轻松解决这个问题。如果我需要从绑定中省略某些字段/属性(通过post-back或其他方式),那么我可以简单地使用“包含/排除”的Bind注释。

是否存在一些我想要的更大的问题,它会建议手动映射过程(模型的所有属性在视图模型上是否重复)是否可取?

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

数据分析

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

因为将数据直接发送到视图是不好的做法。这有很多原因,包括安全原因。但是还有更实际的原因,例如能够应用视图模型属性(当你的实体被自动生成时你不能做的事情,虽然有很多方法可以解决这个问题,比如伙伴类)。

总的来说。您需要特定于视图的视图模型。此视图模型应映射到您的业务对象。您的业​​务对象是否与实体对象不同,更多的是灰色区域,但视图模型和业务模型之间应该有明确的区别。

答案 2 :(得分:0)

我几乎总是在我的ViewModels中保留一个模型引用。如果我需要一些额外的属性,我只需将它们添加到我的viewmodel中。这是很好的IMO。