大部分の.NET MVCの例で見られるパターンは、コントローラと下位レイヤの間で渡されたオブジェクトをモデルにして、それらに直接フォームバインドすることです。私はdomain-drivenアプローチを選択しました。そこでは、レイヤー間でドメインオブジェクトが渡されます。アイデアは、これらのオブジェクトがビューに渡されるということでした。ドメイン駆動型デザインのMVC .NETフォーム
私が取り組んでいる問題は、フォーム付きのページになるときです。私は戻ってくる途中でバインドするフォームのための別々のオブジェクトを用意しようとしていました(バリデーション注釈も含まれていました)。 1つのオブジェクトが異なるページによって更新される可能性があるため、各オブジェクトのアドレスは1ページに表示されない場合がありますが、検証はユニバーサルドメインオブジェクトでは必ずしも機能しません)。フォームをポストバックしてエラーを表示する必要があると、これは複雑になります。
たとえば、更新ページを表示します。私は自分のドメインのPersonオブジェクトにビューを入力したいと思います。ページにはそのフィールドの値が入力されます。ポストバックアクションは、そのページのフォームオブジェクトを取得し、それを検証します。それが渡された場合は、automapperを使用してフォームからドメインオブジェクトに値をコピーして保存します。これはすべて動作します。エラーが発生した場合は、ページが再表示されます。それがドメインオブジェクトに入力された場合は、ユーザーが入力した値の代わりに古い値に基づいてフィールドを再ポピュレートするだけです。フォームオブジェクトにタイプされている場合は、すべてのドメインオブジェクトをすべてのページのこれらのフォームオブジェクトに変換する必要があります(ドメインオブジェクトに渡す必要がある場合は、そのページに対して読み取り専用)。
私はここで何かを見過ごしている/過度に複雑にしていると確信しています。
更新 @Charlinoが言ったことのために遊んで興味深い発見。厳密に型指定されたhtmlヘルパーを使用して入力(Html.TextBoxFor())を行うと、ビューがドメインオブジェクトに型付けされていても値が記憶されます。私が一般的なもの(Html.TextBox())または生のHTMLを使用していると思われません。
"フォームオブジェクト"もPersonオブジェクトですか?もしそうなら、それをビューに戻すだけです。 – Paul
@paulフォームオブジェクトはpersonオブジェクトのサブセットです - 私はHTTP Post経由で取得すると予想されるフィールドだけを検証したいと思います。 – Parrots
実際にこれを実装しましたか?ページを再表示するときの私の理解から、フィールドを再作成するためにViewStateをチェックする必要があり、ドメインオブジェクトを使用すべきではありません。私は@ qstarinのアプローチに同意しますが、@ jfarのコメントにも同意します。 – Charlino