C# MVC-使用AutoMapper发送集合视图模型
我有一个相当简单的映射示例,它正在工作,但我不相信我做的是正确的。有人能帮我理解将集合发送到视图模型的最佳实践是什么吗 这是AutoMapper.CreateMap: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 此特定场景的正确体
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);