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

C# MVC-使用AutoMapper发送集合视图模型,c#,asp.net-mvc,entity-framework-5,automapper,C#,Asp.net Mvc,Entity Framework 5,Automapper,我有一个相当简单的映射示例,它正在工作,但我不相信我做的是正确的。有人能帮我理解将集合发送到视图模型的最佳实践是什么吗 这是AutoMapper.CreateMap: Mapper.CreateMap<Product, _BrowseViewModel>(); 我关心的是视图中的模型现在是一个集合;这似乎不对 @model IEnumerable<AppStoreModel._BrowseViewModel> @model IEnumerable 此特定场景的正确体

我有一个相当简单的映射示例,它正在工作,但我不相信我做的是正确的。有人能帮我理解将集合发送到视图模型的最佳实践是什么吗

这是AutoMapper.CreateMap:

Mapper.CreateMap<Product, _BrowseViewModel>();
我关心的是视图中的模型现在是一个集合;这似乎不对

@model IEnumerable<AppStoreModel._BrowseViewModel>
@model IEnumerable

此特定场景的正确体系结构是什么?

实现您想要实现的目标的最佳方法是使用AutoMapper的投影功能,如下所示:

IEnumerable<BrowseProduct> browseViewModel = dsProduct.Project().To<BrowseProduct>().ToList();
IEnumerable browseViewModel=dsProduct.Project().To().ToList();
使用以下自动映射配置:

Mapper.Map<Product, BrowseProduct>();
Mapper.Map();
如果您正在向视图发送数据,并且担心将数据作为列表发送,那么我建议您向包含产品列表的视图发送视图模型,例如:

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

    public IEnumerable<BrowseProduct> Products { get; set; }
}
公共类浏览产品视图模型
{
公共字符串ProductCategory{get;set;}
公共IEnumerable乘积{get;set;}
}

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

将产品作为子类似乎效果更好(感谢MajoB)

下面是与映射集合作斗争的任何人的代码

视图模型:

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

public class _BrowseProduct
{
    public long ProductID { get; set; }
    public string ProductName { get; set; }
    ... etc
}
公共类\u浏览视图模型
{
公共IEnumerable BrowseProduct{get;set;}
}
公共类BrowseProduct
{
公共长ProductID{get;set;}
公共字符串ProductName{get;set;}
等
}
自动映射配置:

Mapper.CreateMap<Product, _BrowseProduct>();
Mapper.CreateMap();
控制器:

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

return View(browseViewModel);
\u BrowseViewModel BrowseViewModel=new\u BrowseViewModel();
browseViewModel.BrowseProduct=Mapper.Map(dsProduct);
返回视图(浏览视图模型);

我认为这是实现我的目标的一个很好的方法。

最好将您的集合包装到另一个类中。为什么您认为将集合发送到视图是错误的,如果您有多个产品,那么为什么不呢?您好,David,我可能稍后会将不在“产品”集合中的项目添加到ViewModel中;这就是为什么我认为整个ViewModel不应该是一个集合。我现在已经将产品制作成了_BrowseViewModel的子类;但是我有一个自动映射错误:映射类型:IEnumerable
1->\u BrowseViewModel System.Collections.Generic.IEnumerable
1[[ProjectModel.Product,ProjectModel,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]->ProjectModel.\u BrowseViewModelThanks,我现在来看看如何使用投影功能。这基本上就是我在这里所做的事情的简写吗<代码>browseViewModel.BrowseProduct=Mapper.Map(dsProduct)是,不过它还有一个额外的好处,就是可以编译为实体框架生成的查询字符串;这意味着SQL查询将选择并返回BrowseProduct模型中的属性。
Mapper.CreateMap<Product, _BrowseProduct>();
 _BrowseViewModel browseViewModel = new _BrowseViewModel();
 browseViewModel.BrowseProduct = Mapper.Map<IEnumerable<Product>, IEnumerable<_BrowseProduct>>(dsProduct);

return View(browseViewModel);