我有一个Item
包含使用AutoMapperProduct
映射到各自ViewModel
对象的列表。
在我的 MVC 项目中,我有一个 Action 方法,它显示一个Item
带有选中的Product
. 为此,我有一个包含展平对象的ViewModel
调用,一个's 列表和一个展平 selected 。ItemDetailsViewModel
Item
ProductViewModel
Product
我遇到的困难是最好地展示这个扁平的 selected Product
。
把它想象成 eBay,你有一个Item
,你可以选择多种变体,例如按颜色。对我来说,多种变体是Products
. 当用户选择Product
我要返回的ItemDetails
即Item
,列表Products
和选定的Product
。
我想知道这样做的最佳方法是什么?目前我的方法是将一个映射Item
到一个ItemDetailsViewModel
,选择所需的ProductViewModel
,然后专门将ProductViewModel
背面的每个属性映射到ItemDetailsViewModel
. 此外,由于Item
和Product
具有相同的命名属性,映射产品的最后一行将覆盖Item
s id 和代码。
关于如何最好地配置映射的任何建议?
我省略了我现有的映射,因为它主要是直接的一对一映射,除了将选定的映射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);
}
}