8

AutoMapperを使用してそれぞれのオブジェクトにマップされる のItemリストを含む があります。ProductViewModel

私の MVC プロジェクトにはItem、選択したを表示する Action メソッドがありますProduct。このために、フラット化されたオブジェクト、のリスト、およびフラット化された選択されたオブジェクトを含むViewModel呼び出しがあります。ItemDetailsViewModelItemProductViewModelProduct

私が抱えている問題は、この平坦化された選択済みを最もよく表示することですProduct

Itemたとえば色ごとに複数のバリエーションを選択できるeBay のようなものだと考えてください。私にとって、複数のバリエーションはProducts. ユーザーが を選択すると、つまり、 のリスト、および選択されたProductが返されます。ItemDetailsItemProductsProduct

私はこれを行う最善の方法を考えていましたか?現時点では、私のメソッドは を にマッピングしItemItemDetailsViewModel必要なものを選択してから、バックProductViewModelの各プロパティを に具体的にマッピングしています。また、とが同じ名前のプロパティを持っているため、製品を元にマッピングする最後の行でs id とコードが上書きされます。ProductViewModelItemDetailsViewModelItemProductItem

マッピングを構成する最善の方法について何か提案はありますか?

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

1 に答える 1

0

1 つの解決策は、 からへItemDetailsViewModelのマッピングでのプロパティを無視することです。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 に答える