2014-10-31 45 views
0

我有一個工作的映射的相當簡單的例子,但我不相信,我做了正確的事情集合視圖模型。有人能幫助我理解將收藏集發送到View Model的最佳做法是什麼?MVC - 發送使用AutoMapper

這是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類只包含從產品表中的幾個字段將顯示:

public class _BrowseViewModel 
{ 

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

我擔心的是,現在在視圖模型是一個集合;這看起來不正確。

@model IEnumerable<AppStoreModel._BrowseViewModel> 

此特定場景的正確架構是什麼?

+0

將是更好的包裹你收集到另一個類 – 2014-10-31 07:30:58

+0

爲什麼你認爲它的錯誤的集合發送到視圖,如果您有多個產品,那麼爲什麼不呢? – 2014-10-31 08:26:32

+0

嗨大衛, 我可以稍後添加項目的ViewModel不在「產品」集合;這就是爲什麼我認爲整個ViewModel不應該是一個集合。 我已經使產品成爲_BrowseViewModel的子類;但是我有一個AutoMapper錯誤: 映射類型: IEnumerable'1 - > _BrowseViewModel System.Collections.Generic.IEnumerable'1 [[ProjectModel.Product,ProjectModel,版本= 1.0.0.0,文化=中性公鑰=空]] - > ProjectModel._BrowseViewModel – g4mbit 2014-10-31 09:05:26

回答

0

做你想要達到什麼做的最好的方法是使用AutoMapper的投影功能,比如:使用以下AutoMapper配置

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

Mapper.Map<Product, BrowseProduct>(); 

如果」重新將數據發送到視圖和關心發送數據的列表,然後我會建議發送視圖模型到視圖包含您的產品列表中,例如:

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

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

此次推出的新視圖模型將允許您將新數據傳遞到您的視圖,而不需要你的剃鬚刀視圖中更新視圖模型類型。

+0

謝謝喬, 我會看看現在使用投影功能。它基本上是我在這裏做的事情的一小部分嗎? 'browseViewModel.BrowseProduct = Mapper.Map ,IEnumerable <_BrowseProduct >>(dsProduct);' – g4mbit 2014-10-31 11:12:27

+0

是的,雖然有被編譯到實體框架生成的查詢字符串的額外好處;這意味着SQL查詢將選擇並返回BrowseProduct模型中的屬性。 – 2014-10-31 11:14:52

0

看來,產品作爲兒童類更好地工作(感謝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); 

我想,這是實現我所要做的相當的好方法。