将IEnumerable <object>传递给ViewModel - Object是否需要是ViewModel?</object>

时间:2012-02-22 19:38:27

标签: asp.net-mvc-3 viewmodel automapper

今天了解MVC,并遇到了不将模型直接传递给视图的最佳实践。相反,请使用ViewModel。

我研究了AutoMapper并计划使用它将我的ViewModel映射到相应的模型。我理解AutoMapper非常智能,只要映射了源和目的地,就可以将IEnumerable映射到IEnumerable而无需单独的映射。

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

所以Activity就是有问题的模型:

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

我需要创建ActivityViewModel并像这样编写我的ActivityHistoryViewModel吗?

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

有更简单的方法吗?

1 个答案:

答案 0 :(得分: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时,您可以创建属性属性重复类型,或者删除不需要的多余数据(在我的情况下,它将类似于“创建日期”,这是db生成的,对用户来说并不重要。)

如果你想坚持使用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);