8

我有一个Item包含使用AutoMapperProduct映射到各自ViewModel对象的列表。

在我的 MVC 项目中,我有一个 Action 方法,它显示一个Item带有选中的Product. 为此,我有一个包含展平对象的ViewModel调用,一个's 列表和一个展平 selected 。ItemDetailsViewModelItemProductViewModelProduct

我遇到的困难是最好地展示这个扁平的 selected Product

把它想象成 eBay,你有一个Item,你可以选择多种变体,例如按颜色。对我来说,多种变体是Products. 当用户选择Product我要返回的ItemDetailsItem,列表Products和选定的Product

我想知道这样做的最佳方法是什么?目前我的方法是将一个映射Item到一个ItemDetailsViewModel,选择所需的ProductViewModel,然后专门将ProductViewModel背面的每个属性映射到ItemDetailsViewModel. 此外,由于ItemProduct具有相同的命名属性,映射产品的最后一行将覆盖Items id 和代码。

关于如何最好地配置映射的任何建议?

我省略了我现有的映射,因为它主要是直接的一对一映射,除了将选定的映射ProductViewModelItemDetailsViewModel.

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);
    }
}
4

1 回答 1

0

一种解决方案是忽略从toItemDetailsViewModel映射中的属性:ProductViewModelItemDetailsViewModel

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));
于 2014-01-13T14:34:58.510 回答