0

WinForms アプリを ASP.NET MVC4 に変換し、AutoMapper を使用してドメイン エンティティと ViewModels の間をマッピングする ViewModel アプローチを実装しようとしています。主に、より複雑なオブジェクト グラフを ViewModels にフラット化して、ビューで簡単にバインドできるようにします。

私が直面している問題は、ドメイン モデルが a を適用したいフィールドを空白のままにしておくと、Trim()aNullReferenceExceptionがスローされることです。

もともとこれはすべてドメイン オブジェクトで処理されていました。 、それをドメインモデルに渡すことに依存し、値が永続化されたときにTrimまたはToUpperを設定させます。

public virtual String Name
{
    get { return _name; }
    set { _name = StringFormatting.ToTitleCase(value.Trim()); }
}

public virtual String Email
{
    get { return _email; }
    set { _email = value.Trim(); }
}

私のViewModelに関しては、自動実装されたプロパティを取得しました:

public class CustomerCreateViewModel
{
    [Required(ErrorMessage="Please enter a name for this customer")]
    public string Name { get; set; }

    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }
}

ただし、フォームが送信されたときに電子メールのテキストボックスが空の場合はNullReferenceException

セット { _email = value.Trim() ; }

それを回避するために、セッターガード句を追加しました

public virtual String Email
{
    get { return _email; }
    set
    {
        if (_email == value) return;
        _email = value.Trim();
    }
}

そのフィールドのエラー解消されましたが、次のプロパティであるモバイルに移動しました。修正を繰り返し、次から次へと次へと進みました。これらはいずれも必須ではないため、空で渡すのが正しいです。

マップされているすべての文字列がトリミングされるように指定する AutoMapper の方法はありますか? 私はこれに間違ってアプローチしていますか?弦をトリムする必要はありませんか?または、そのトリミングが実行された場合、私の好みは、送信されたときに文字列をトリミングするだけで済みますが、個々のコントローラーのコードではなく、ViewModel / Domain モデルのどこかで行う必要があるように感じますが、どこ?

4

2 に答える 2

1

このように使えますITypeConverter<M,V>...

public class ModelToViewModelConverter : ITypeConverter<Model, ViewModel>
{
        public UIItemViewModel Convert(ResolutionContext context)
        {
            Model model = (Model)context.SourceValue;
            // Perform your logic 
        }
}
于 2013-03-23T00:58:07.233 に答える