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