私の問題
ビューに存在しない同じクラスの「ソース」オブジェクトプロパティは、「ターゲット」オブジェクトの同じプロパティをnullで上書きしています。これを防ぐにはどうすればよいですか?影響を受けるのは、入力された(nullではない)プロパティのみが「ターゲット」オブジェクトにマージされるようにする方法です。Automapperでもこれを試しましたが失敗しましたが、代わりにAutomapperソリューションを使用できれば幸いです。
この「ヌルマッピング」の質問が以前に出てきたことはありがたいですが、ネストされたオブジェクトがあるため、私の状況がより複雑になるのではないかと心配しています。提案されたオプションを試してみましたが、機能させることができませんでした。だからここにいます。
助けてくれてありがとう。
これは複雑な問題であり、特に誰かが私のためにコードサンプルを作成できる場合は、これに関する支援に本当に感謝しています。私は数日間これの上に髪を引っ張っています:(
私が試みたこと
2つのオブジェクトがあります。1つはoriginal( "Target")で、もう1つ( "Source")はフォーム(ビュー)によって入力されます。
元の「ターゲット」オブジェクト(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」プロパティにnull値を作成していると思われます。
public ActionResult Index(Document myDoc)
どうもありがとう、エド。
編集1:これはサブクラスによるネストされたマッピングの問題だと思います。ValueInjectorでこれをどのようにソートするかわかりません。
EDIT2 :ネストされたマッピングのドキュメントから可能なオートマッパーソリューションですが、動作させることができませんでした。私はまだ自分のヌルをターゲットに渡しています。
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));