2010-12-01 11 views
3

大部分の.NET MVCの例で見られるパターンは、コントローラと下位レイヤの間で渡されたオブジェクトをモデルにして、それらに直接フォームバインドすることです。私はdomain-drivenアプローチを選択しました。そこでは、レイヤー間でドメインオブジェクトが渡されます。アイデアは、これらのオブジェクトがビューに渡されるということでした。ドメイン駆動型デザインのMVC .NETフォーム

私が取り組んでいる問題は、フォーム付きのページになるときです。私は戻ってくる途中でバインドするフォームのための別々のオブジェクトを用意しようとしていました(バリデーション注釈も含まれていました)。 1つのオブジェクトが異なるページによって更新される可能性があるため、各オブジェクトのアドレスは1ページに表示されない場合がありますが、検証はユニバーサルドメインオブジェクトでは必ずしも機能しません)。フォームをポストバックしてエラーを表示する必要があると、これは複雑になります。

たとえば、更新ページを表示します。私は自分のドメインのPersonオブジェクトにビューを入力したいと思います。ページにはそのフィールドの値が入力されます。ポストバックアクションは、そのページのフォームオブジェクトを取得し、それを検証します。それが渡された場合は、automapperを使用してフォームからドメインオブジェクトに値をコピーして保存します。これはすべて動作します。エラーが発生した場合は、ページが再表示されます。それがドメインオブジェクトに入力された場合は、ユーザーが入力した値の代わりに古い値に基づいてフィールドを再ポピュレートするだけです。フォームオブジェクトにタイプされている場合は、すべてのドメインオブジェクトをすべてのページのこれらのフォームオブジェクトに変換する必要があります(ドメインオブジェクトに渡す必要がある場合は、そのページに対して読み取り専用)。

私はここで何かを見過ごしている/過度に複雑にしていると確信しています。

更新 @Charlinoが言ったことのために遊んで興味深い発見。厳密に型指定されたhtmlヘルパーを使用して入力(Html.TextBoxFor())を行うと、ビューがドメインオブジェクトに型付けされていても値が記憶されます。私が一般的なもの(Html.TextBox())または生のHTMLを使用していると思われません。

+0

"フォームオブジェクト"もPersonオブジェクトですか?もしそうなら、それをビューに戻すだけです。 – Paul

+0

@paulフォームオブジェクトはpersonオブジェクトのサブセットです - 私はHTTP Post経由で取得すると予想されるフィールドだけを検証したいと思います。 – Parrots

+0

実際にこれを実装しましたか?ページを再表示するときの私の理解から、フィールドを再作成するためにViewStateをチェックする必要があり、ドメインオブジェクトを使用すべきではありません。私は@ qstarinのアプローチに同意しますが、@ jfarのコメントにも同意します。 – Charlino

答えて

3

それぞれのビューごとにViewModelオブジェクトを用意することが私のやり方です。

ViewModelとマッピングを定義する必要があるので、少し前処理が必要ですが、そのコードは非常に単純で簡単です。書き込みに数秒しかかかりません。

多くの場合、フォームが必要なときは、別のフォームオブジェクトを作成し、ViewModelにそのフォームオブジェクトが含まれるようにします。

public class MyViewModel 
{ 
    public string SomeNonFormDisplayValue { get; set; } 
    public bool AnotherDisplayOnlyValue { get; set; } 
    public IEnumerable<Tuple<int, string>> SelectionListItems { get; set; } 

    public MyViewsForm Form { get; set; } 
} 


public class MyViewsForm 
{ 
    public string EditableProperty { get; set; } 
    public int SelectionListItemId { get; set; } 
} 

ビューモデルをViewModelに入力しますが、ポストアクションメソッドをフォームにするだけです。

public class MyController 
{ 
    [HttpGet] 
    public ActionResult Edit() { ... } 

    [HttpPost] 
    public ActionResult Edit(MyViewsForm form) { ... } 
} 

私はまた、クエリメソッドがViewModelに、ない形と別の移入1を取得するために作る - 私はエラーでPOST'dフォームを返すときのために。

+0

この手法には投票しますが、ViewModel内のフォームオブジェクトは不要であまりにも複雑ですので注意してください。 – jfar

+0

私は両方の方法を試して、入れ子になったフォームオブジェクトを好む。それについて何が複雑ですか?これはプロパティgetters&setters以上のものを持つだけの追加クラスです。そして、私は半分しか必要でないオブジェクトを投稿することに伴う混乱を排除するのに役立つことがわかります。 –

+0

私もこのテクニックに同意し、@ jfarのコメントにも同意します。私は私のビューモデルの中に私のフォームモデルを持っているが、昨夜変更され、いくつかのシャックルが壊れているように感じる。 – Charlino

関連する問題