ViewModel问题

时间:2011-03-06 21:39:14

标签: asp.net-mvc

为了简单起见,假设我有一个CustomerViewModel,我想显示他们的基本信息(姓名,电子邮件,电话等)以及最近的订单列表。

我应该有一个集合属性,比如说OrderListViewModel类型的订单,还是应该使用从存储库返回的POCO对象?

我想我真正想问的是,我应该为每个实体都有一个View模型,然后将那些附加到“Parent”View Models的集合?

4 个答案:

答案 0 :(得分:3)

是的,你应该拥有ViewModel,但你不必这样做。如果您正在关注DDD,那么您将永远不会让实体到达视图。我已经开始使用我的域对象作为我的视图模型的小应用程序,之后应用程序对设计决策感到遗憾。

以下是View Model模式的一篇好文章,以及如何使用Automapper帮助从左到右添加其他内容:http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx

http://www.bengtbe.com/blog/post/2009/04/14/Using-AutoMapper-to-map-view-models-in-ASPNET-MVC.aspx

您的ViewModel应如下所示:

public class CustomerModel {
    public string Name {get; set;}
    public string Email {get; set;}
    public string Phone {get; set;}
    public OrderModel[] Orders {get; set;}

  public class OrderModel {
    public int OrderNumber {get; set;}
    public double OrderTotal {get; set;}
  }
}

配置自动映射,并将所有问题分开(SoC)

答案 1 :(得分:3)

基本上,您应该为每个独特的视图都有一个独特的视图模型。视图模型应包含视图将要呈现的所有数据。

因此,如果您要提供客户信息以及订单,View Model可以有一个客户实例和一个订单列表:

class ViewModel
{
    Customer Customer { get; set; }
    IEnumerable<Order> Orders { get; set; }
}

我建议使用View Model,即使简单的业务对象也可以。这使得维护变得更加容易,而且众所周知,需求也会发生变化。

AutoMapper是一个很棒的工具,可以轻松处理View Models。

答案 2 :(得分:2)

不要无缘无故地创建视图模型。视图模型应提供将模型与视图分离的特定值,以及添加特定视图所需的其他项(下拉列表等),您不希望将其放入模型中。视图模型应将1到1映射到特定视图。

如果您现在没有上述需求,请不要创建它。

我认为从POCO开始并在需要时创建视图模型没有任何问题。我没有看到重构和创建视图模型的一个大问题,您需要在视图和模型之间进行解耦。对于琐碎的情况,我会避免过度设计,但要知道你的目标是最终将视图模型作为一种解决方案,以避免耦合或添加视图所需的额外内容。

答案 3 :(得分:0)

理想情况下,您应该为视图处理的每个实体使用View Model。有时当实体太琐碎时,你可以跳过我猜的模型。