[英]How to flatten a conditional object in a list in automapper
我有一個Item
,其中包含使用AutoMapper映射到其各自的ViewModel
對象的Product
的列表。
在我的MVC項目中,我有一個Action方法,該方法顯示帶有選定Product
的Item
。 為此,我有一個名為ItemDetailsViewModel
的ViewModel
,其中包含展平的Item
對象, ProductViewModel
的列表和展平的選定Product
。
我遇到的困難最好是展示這個扁平化的選定Product
。
可以像在eBay上一樣擁有Item
並且可以選擇多種變體,例如按顏色。 對我來說,多個變體是Products
。 當用戶選擇Product
我要返回ItemDetails
即Item
, Products
列表和所選Product
。
我想知道這樣做的最好方法嗎? 目前,我的方法是將Item
映射到ItemDetailsViewModel
,選擇所需的ProductViewModel
,然后專門將ProductViewModel
每個屬性映射回ItemDetailsViewModel
。 另外,由於Item
和Product
具有相同的命名屬性,因此映射該產品的最后一行將覆蓋Item
的id和代碼。
關於如何最佳配置映射的任何建議?
ItemDetailsViewModel
去了ItemDetailsViewModel
映射,因為除了將所選的ProductViewModel
映射回ItemDetailsViewModel
之外,它大多是直接的一對一映射。
Mapper.CreateMap<Item, ItemViewModel>()
.ReverseMap();
Mapper.CreateMap<ProductViewModel, ItemDetailsViewModel>()
.ForMember(d => d.ProductId, o => o.MapFrom(s => s.Id))
.ForMember(d => d.ProductCode, o => o.MapFrom(s => s.Code));
班級
public class Item
{
public int Id { get; set; }
public string Code { get; set; }
public IList<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Code { get; set; }
}
public class ItemViewModel
{
public int Id { get; set; }
public string Code { get; set; }
public IList<ProductViewModel> Products { get; set; }
}
public class ItemDetailsViewModel : ItemViewModel
{
public int ProductId;
public string ProductCode;
}
public class ProductViewModel
{
public int Id { get; set; }
public string Code { get; set; }
}
行動
public ActionResult ItemDetails()
{
var item = new Item
{
Id = 1,
Code = "Item1",
Products = new List<Product>()
{
new Product { Id = 1, Code = "Product1" },
new Product { Id = 2, Code = "Product2" },
new Product { Id = 3, Code = "Product3" },
}
};
var productCode = "Product2";
var itemDetailsViewModel = Mapper.Map<ItemDetailsViewModel>(item);
if (itemDetailsViewModel.Products != null && itemDetailsViewModel.Products.Count > 0)
{
ProductViewModel productViewModel = null;
if (!String.IsNullOrEmpty(productCode))
productViewModel = itemViewModel.Products.FirstOrDefault(e => e.Code.Equals(productCode, StringComparison.OrdinalIgnoreCase));
if (productViewModel == null)
productViewModel = itemViewModel.Products[0];
Mapper.Map<ProductViewModel, ItemDetailsViewModel>(productViewModel, itemDetailsViewModel);
}
}
一種解決方案是忽略從ProductViewModel
到ItemDetailsViewModel
映射中ItemDetailsViewModel
中的屬性:
Mapper.CreateMap<ProductViewModel, ItemDetailsViewModel>()
.ForMember(d => d.Id, opt => opt.Ignore())
.ForMember(d => d.Code, opt => opt.Ignore())
.ForMember(d => d.ProductId, o => o.MapFrom(s => s.Id))
.ForMember(d => d.ProductCode, o => o.MapFrom(s => s.Code));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.