将IEnumerable
问题描述:
今天让我的头转向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; }
}
有没有更简单的方法来做到这一点?
答
是的,这是正确的。假设你的模型将需要的唯一的数据列表,那么你并不真正需要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);
Duh,didn'甚至不考虑传递IEnumerable。但我真的想到更大的场景,我需要传递更多的数据。 –
2012-02-22 19:52:58
我添加了代码来代替使用'ActivityHistoryViewModel'。希望它正在寻找什么。 – 2012-02-22 20:02:04
太棒了,我设法让一切正常,包括对嵌套实体对象上的属性的自定义映射。我感谢您的帮助。一旦你想出来,它总是变得容易。 :) – 2012-02-22 20:14:14