我的DTO(为演示目的而简化):
项目(DTO映射到我的ViewModel):
public class Item {
public Item() { }
public virtual Guid ID { get; set; }
public virtual ItemType ItemType { get; set; }
public virtual string Title { get; set; }
}
ItemType(由我的Item类引用):
public class ItemType {
public ItemType() { }
public virtual Guid ID { get; set; }
public virtual IList<Item> Items { get; set; }
public virtual string Name { get; set; }
}
我的ViewModel(用于编辑我的Item类数据):
public class ItemEditViewModel {
public ItemEditViewModel () { }
public Guid ID { get; set; }
public Guid ItemTypeID { get; set; }
public string Title { get; set; }
public SelectList ItemTypes { get; set; }
public IEnumerable<ItemType> ItemTypeEntities { get; set; }
public BuildItemTypesSelectList(Guid? itemTypeID)
{
ItemTypes = new SelectList(ItemTypeEntities, "ID", "Name", itemTypeID);
}
}
我的AutoMapper映射代码:
Mapper.CreateMap<Item, ItemEditViewModel>()
.ForMember(dest => dest.ItemTypes, opt => opt.Ignore());
Mapper.CreateMap<ItemEditViewModel, Item>();
控制器代码(再次,为演示而简化):
public ActionResult Create()
{
var itemVM = new ItemEditViewModel();
// Populates the ItemTypeEntities and ItemTypes properties in the ViewModel:
PopulateEditViewModelWithItemTypes(itemVM, null);
return View(itemVM);
}
[HttpPost]
public ActionResult Create(ItemEditViewModel itemVM)
{
if (ModelState.IsValid) {
Item newItem = new Item();
AutoMapper.Mapper.Map(itemVM, newItem);
newItem.ID = Guid.NewGuid();
...
// Validation and saving code here...
...
return RedirectToAction("Index");
}
PopulateEditViewModelWithItemTypes(itemVM, null);
return View(itemVM);
}
现在,发生了什么:
在我的HttpPost Create操作结果中,在我的控制器中,我使用Automapper将ItemEditViewModel映射到我的Item DTO类,在SelectList中选择的ItemType ID值不绑定到Item.ItemType.ID属性。 Item.ItemType属性为null。
我认为这是因为,因为我的Item DTO类中没有ItemTypeID Guid值,并且我没有为Item DTO中的同名属性创建新的ItemType类,所以AutoMapper无法存储ItemType ID值。
我认为这取决于我的Automapper映射配置。
我确信这是一件我很容易忽视的事情。
提前感谢任何建议!
答案 0 :(得分:2)
很确定这是因为automapper被设计为Big Shape-&gt;较小/平面形状的绘图工具,而不是相反。这是不受支持的。
答案 1 :(得分:1)
你应该可以说:
Mapper.CreateMap<ItemEditViewModel, Item>()
.ForMember(dest => dest.ItemType, opt => opt.MapFrom(src =>
{
return new ItemType()
{
ID = src.ItemTypeID
}
};