我的问题
“源”对象视图中不存在的同一类的属性用空值覆盖“目标”对象中的相同属性。我该如何防止这种情况?影响我如何确保仅填充(非空)属性合并到“目标”对象中。我也用 Automapper 尝试过,但失败了,但我很乐意使用 Automapper 解决方案作为替代方案。
我很欣赏这个“空映射”问题以前出现过,但我担心我的情况会更复杂,因为有嵌套对象。好吧,我尝试了建议的选项,但无法使它们起作用。所以我在这里。
非常感谢任何帮助。
我很欣赏这是一个复杂的问题,并且真的非常感谢任何帮助,特别是如果有人可以为我制作代码示例。这几天我把头发拉出来了:(
我尝试过的
我有 2 个对象,一个是原始对象(“目标”),一个(“源”)由一个表单(即视图)填充。
原始的“目标”对象(myOrigDoc)如下所示:
表单“源”对象(myDoc)如下所示:
然后我做映射:
myOrigDoc.Introduction.InjectFrom<StrNotNull>(myDoc.Introduction);
使用以下注射器:
public class StrNotNull: ConventionInjection
{
bool blnNotNull = false;
bool blnMatch = false;
protected override bool Match(ConventionInfo c)
{
blnNotNull = false;
blnMatch = false;
//if ((c.SourceProp.Type == typeof(string)) && (c.SourceProp.Value != null))
// blnAssignable = true;
if (c.SourceProp.Value != null)
blnNotNull = true;
if ((c.SourceProp.Name == c.TargetProp.Name) && (blnNotNull))
blnMatch = true;
return blnMatch;
}
}
我最终得到:
表单上没有“DateOfBirth”字段,因此我怀疑模型绑定正在为新的“MyDoc”对象上的“DataOfBirth”属性创建空值,当我调用时:
public ActionResult Index(Document myDoc)
非常感谢,埃德。
EDIT1:我相信这是由于子类的嵌套映射问题。不确定我如何在 ValueInjector 中对其进行排序。
EDIT2:嵌套映射文档中可能的 Automapper 解决方案,但我无法让它工作。我仍然让我的空值进入目标。:
Mapper.CreateMap<XSD_Smart2.Document, XSD_Smart2.Document>
().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
Mapper.CreateMap<XSD_Smart2.DocumentIntroduction, XSD_Smart2.DocumentIntroduction>
().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
Mapper.CreateMap<XSD_Smart2.Client, XSD_Smart2.Client>().ForAllMembers(opt =>
opt.Condition(srs => !srs.IsSourceValueNull));