如何解决自动映射器映射问题:从DTO展平到ViewModel可以正常工作-反之则不行
| 我的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映射配置。
我确定这是我所忽略的简单事情。
在此先感谢您的任何建议!
解决方法
可以肯定的是,这是因为automapper设计为Big Shape-> Smaller / Flat Shape映射工具,而不是相反。只是不支持。
, 您应该能够说:
Mapper.CreateMap<ItemEditViewModel,Item>()
.ForMember(dest => dest.ItemType,opt => opt.MapFrom(src =>
{
return new ItemType()
{
ID = src.ItemTypeID
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。