MVC - 使用AutoMapper发送集合视图模型

时间:2014-10-31 06:46:36

标签: c# asp.net-mvc entity-framework-5 automapper

我有一个相当简单的映射工作示例,但我不相信我正在做正确的事情。有人可以帮我理解将集合发送到View模型的最佳实践吗?

这是AutoMapper.CreateMap:

Mapper.CreateMap<Product, _BrowseViewModel>();

这是控制器:

var dsProduct = from p in Entity.Product
select p;

if (dsProduct.Any())
{
   IEnumerable<_BrowseViewModel> browseViewModel = Mapper.Map<IEnumerable<Product>, IEnumerable<_BrowseViewModel>>(dsProduct.ToList());
   return View(browseViewModel);
}

_BrowseViewModel类仅包含将显示的Product表中的一些字段:

public class _BrowseViewModel
{

    public long ProductID { get; set; }
    public string ProductName { get; set; }
    ... etc

我担心的是视图中的模型现在是一个集合;这似乎不对。

@model IEnumerable<AppStoreModel._BrowseViewModel>

此特定方案的正确架构是什么?

2 个答案:

答案 0 :(得分:0)

执行您尝试实现的目标的最佳方式是使用AutoMapper的投影功能,如下所示:

IEnumerable<BrowseProduct> browseViewModel = dsProduct.Project().To<BrowseProduct>().ToList();

使用以下AutoMapper配置:

Mapper.Map<Product, BrowseProduct>();

如果您要向视图发送数据并担心将数据作为列表发送,那么我建议将视图模型发送到包含您的产品列表的视图,例如:

public class BrowseProductsViewModel
{
    public string ProductCategory { get; set;}

    public IEnumerable<BrowseProduct> Products { get; set; }
}

视图模型的引入将允许您将新数据传递到视图,而无需更新剃刀视图中的视图模型类型。

答案 1 :(得分:0)

似乎将Product作为子类更好地工作(感谢MajoB)。

这是任何与地图集合作斗争的人的代码。

视图模型:

public class _BrowseViewModel
{
    public IEnumerable<_BrowseProduct> BrowseProduct { get; set; }
}

public class _BrowseProduct
{
    public long ProductID { get; set; }
    public string ProductName { get; set; }
    ... etc
}

AutoMapper配置:

Mapper.CreateMap<Product, _BrowseProduct>();

控制器:

 _BrowseViewModel browseViewModel = new _BrowseViewModel();
 browseViewModel.BrowseProduct = Mapper.Map<IEnumerable<Product>, IEnumerable<_BrowseProduct>>(dsProduct);

return View(browseViewModel);

我认为这是实现我的目标的一种很好的方式。