我正在尝试使用Automapper来完成ViewModel和POCO之间的映射。
我有一个视图,在页面上显示问题,显示Text
和一个复选框 - 设置Selected
属性。
这是回发的,控制器将其映射回现有应用程序数据的顶部。由于Text没有回发,我不想将其删除,因此在ViewModel值为null时尝试忽略Text映射。但它不起作用。当我使用Question和QuestionViewModel尝试测试时 - 映射工作正常,如下所示。
我有以下
public class Question{
public string Text {get;set;}
public bool Selected {get;set;}
}
public class QuestionViewModel{
public string Text{get;set;}
public bool Selected {get;set;}
}
and the mapping I have setup like this:
CreateMap<Question, QuestionViewModel>();
CreateMap<QuestionViewModel, Question>().
.ForMember(q => q.Selected, opt => opt.MapFrom(vm => vm.Selected))
.ForMember(q => q.Text, opt => opt.Condition((s, d, m) => !string.IsNullOrEmpty(m)));
我已成功测试并且一切都很好
Mapper.Map(questionViewModelInstance, questionInstance);
这正确设置了QuestionInstance上的Selected而不覆盖text,在questionViewModel中为null。
但是,当我将这些问题类型作为其他课程的孩子时,事情就不那么顺利了
public class QuestionsViewModel{
public IList<QuestionViewModel> Questions{get;set;}
}
public class Application{
public Product Product {get;set;}
..other properties omitted
}
public class Product{
public IList<Question> Questions {get;set;}
..other properties omitted
}
和映射 - 与上面的映射一起使用
CreateMap<Application, QuestionsViewModel>()
.ForMember(qvm=>qvm.Questions, opt=>opt.MapFrom(a=>a.Product.Questions));
CreateMap<QuestionsViewModel, Application>()
.ForMember(a=>a.Product, opt=>opt.MapFrom(qvm=>qvm));
CreateMap<QuestionsViewModel, Product>();
CreateMap<Product, QuestionsViewModel>();
尝试使用上述相同的Questions / QuestionViewModel数据
Mapper.Map(questionsViewModel, application)
错误地擦除了Application.Product.Questions上的Text属性。
我在这里缺少什么/做错了什么? 任何帮助非常感谢