AutoMapperを使用してそれぞれのオブジェクトにマップされる のItem
リストを含む があります。Product
ViewModel
私の MVC プロジェクトにはItem
、選択したを表示する Action メソッドがありますProduct
。このために、フラット化されたオブジェクト、のリスト、およびフラット化された選択されたオブジェクトを含むViewModel
呼び出しがあります。ItemDetailsViewModel
Item
ProductViewModel
Product
私が抱えている問題は、この平坦化された選択済みを最もよく表示することですProduct
。
Item
たとえば色ごとに複数のバリエーションを選択できるeBay のようなものだと考えてください。私にとって、複数のバリエーションはProducts
. ユーザーが を選択すると、つまり、 のリスト、および選択されたProduct
が返されます。ItemDetails
Item
Products
Product
私はこれを行う最善の方法を考えていましたか?現時点では、私のメソッドは を にマッピングしItem
、ItemDetailsViewModel
必要なものを選択してから、バックProductViewModel
の各プロパティを に具体的にマッピングしています。また、とが同じ名前のプロパティを持っているため、製品を元にマッピングする最後の行でs id とコードが上書きされます。ProductViewModel
ItemDetailsViewModel
Item
Product
Item
マッピングを構成する最善の方法について何か提案はありますか?
選択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);
}
}