我有一个相当简单的映射工作示例,但我不相信我正在做正确的事情。有人可以帮我理解将集合发送到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>
此特定方案的正确架构是什么?
答案 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);
我认为这是实现我的目标的一种很好的方式。