今天了解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; }
}
有更简单的方法吗?
答案 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);