2012-02-22 91 views
2

今天让我的头转向MVC,并且贯穿了不将模型直接传递到视图的最佳实践。相反,使用ViewModel。将IEnumerable <Object>传递给ViewModel - 对象是否需要ViewModel?

我研究了AutoMapper并计划使用它将我的ViewModel映射到相应的模型。我知道AutoMapper足够聪明,可以将IEnumerable映射到IEnumerable而无需单独映射,只要映射源和目标即可。

但是我对如何处理将ViewModel中的IEnumerable传递给我的视图有点困惑。我目前有我的页面使用包含IEnumerable的ViewModel工作,但我读到这与将IEnumerable直接传递给视图一样糟糕。那么,我需要一个单独的ViewModel来保存将在主ViewModel的IEnumerable属性中使用的对象吗?

那么,活​​动是有问题的型号:

public class ActivityHistoryViewModel 
{ 
    public IEnumerable<Activity> activities { get; set; } 
} 

我需要创建ActivityViewModel和写我ActivityHistoryViewModel这样吗?

public class ActivityHistoryViewModel 
{ 
    public IEnumerable<ActivityViewModel> activities { get; set; } 
} 

有没有更简单的方法来做到这一点?

回答

1

是的,这是正确的。假设你的模型将需要的唯一的数据列表,那么你并不真正需要ActivityHistoryViewModel和视图可以分型为这样的:

@model IEnumerable<ActivityViewModel> 

你的自动映射器的配置是这样的:

Mapper.CreateMap<Activity, ActivityViewModel>(); 

你会映射这样的:

IEnumerable<Activity> data = GetActivities(); 
var model = Mapper.Map<IEnumerable<Activity>, IEnumerable<ActivityViewModel>>(data); 
return View(model); 

当你定义ActivityViewModel您可以创建一个财产的属性重复的类型,或修剪掉多余的DAT你不需要(在我的情况下,它会像“创建日期”,这是数据库生成的,对用户不重要)。

或者,如果你想坚持ActivityHistoryViewModel沿着不仅仅是列表的详细经过:

视图类型:

@model ActivityHistoryViewModel 

映射配置可以保持不变

地图这样的:

IEnumerable<Activity> data = GetActivities(); 
var model = new ActivityHistoryViewModel() { 
    someOtherProperty = "hello world!", 
    activities = Mapper.Map<IEnumerable<Activity>, IEnumerable<ActivityViewModel>>(data) 
}; 
return View(model); 
+0

Duh,didn'甚至不考虑传递IEnumerable 。但我真的想到更大的场景,我需要传递更多的数据。 – 2012-02-22 19:52:58

+0

我添加了代码来代替使用'ActivityHistoryViewModel'。希望它正在寻找什么。 – 2012-02-22 20:02:04

+0

太棒了,我设法让一切正常,包括对嵌套实体对象上的属性的自定义映射。我感谢您的帮助。一旦你想出来,它总是变得容易。 :) – 2012-02-22 20:14:14

相关问题