2009-07-22 9 views
2

多くの必須プロパティ(DataAnnotationsを使用)とその他の検証ルールを持つCustomerというビジネスモデルがあります。モデルではなくViewModelを使用するのはいつですか?

私は、顧客の住所フィールドの編集を許可するように意図されたビューを持っています。

私が持っている問題は、私は強く型付けされたビューをしたいが、私はここにお客様のタイプを使用して逃げることができないということです。ビューはアドレスデータを編集するだけなので、検証するためにCustomerオブジェクトが必要とするその他の必要なデータは返されません。

これは私がViewModelを使うべきであることを示唆しています。しかし、新しいViewModel(住所の長さ、郵便番号、州の書式など)に複製する必要がある顧客の住所関連プロパティには、多くのビジネスルールが適用されます。クライアント側の検証(私はxValを使用しています)は、その情報が機能するために必要です。

私はcatch-22のシナリオに到達したと感じています。 DRYは私のモデルが既に持っているViewModelに私のビジネスルールを複製すべきではないと言っていますが、それは決して検証されないのでModelを使うことはできません。

この場合のベストプラクティスは何ですか?

選択パス

Iが最終的に選択した解決策は、ビューモデル・パスでした。私が働かなければならなかったバリデーションを得るためには、単に他の実用的な方法はありませんでした。

はしかし、育てのViewModelを使用していくつかの大まかなスポットを排除することができませんでしたました。私は、ViewModelで再利用していたことが分かっていたプロパティを含むインターフェイスを使用するために、いくつかのモデルをリファクタリングしました。 viewmodelsは今のモデルと同じインタフェースを使用することができますので、それは私がこのようなものを行うことが許さ:

public ActionResult Edit(AddressViewModel address) 
{ 
     if(!ModelState.IsValid) 
      return View(); 

     var customer = Customer.Load(address.CustomerId); 
     UpdateModel<IAddress>(customer); 

     // more stuff .... 
} 

これは私にautomapperを使用するステップを保存します。

私は(ワイアット・バーネットによる)以下の選択の答え私は、ほとんどの場合のために良かったと私はLINQのツーSQLで特に便利私が持っている他のプロジェクト、にそれを使用感じました。

+0

これまでに優雅な解決策を見つけたことはありますか? –

+0

@Andrew - 自分の解決策で質問を更新しました。完璧なルートではありませんが、最高の思い出になるでしょう。 –

答えて

1

私は複雑なモデルクラスで同じ問題に遭遇しましたが、より簡単なビューとモデルバインドではうまくいきません。私もxValを使用していた。私が落ちたトリックは、Validation Buddiesを使用して基本的な検証のためのDRY角度をカバーし、次にAutoMapperを使用して本格的なモデルクラスに物事を戻しました。次に、サーバー側の検証を2回実行して、データベースなどにアクセスする必要があるより複雑なビットをカバーすることができます。

+0

面白い読み物であり、一般的な意味では非常に便利です。私はこれがどれくらい私のケースに当てはまるか分かりません... Grahamという意味でフリーズしたクラスを使用していないので、私は本当にクラスのMetadataTypeバージョンは必要ありません。この時点でバディクラスを作成することは、追加のレイヤーにすぎません。本質的に、検証でVMを作成します。これは私の唯一の選択かもしれません、私はちょうどそれが "正しい"とは見ません。私はこれを考え続けています。 –

0

技術standpoingから、あなたのビューは、あなたのViewModelではなく、モデルに相談してください。そのため、ビューモデルはすべての検証をモデルに委譲する必要があります。 ViewModelはインタラクションレイヤのものを追加する必要があります。

もちろん、これはすべてSilverlightで崩壊します。通常、クライアント側で何らかの迅速な検証が必要なので、突然すべての検証ルールをViewModelにコピーしています。私はそれについてまだ方法を考え出していない。

+0

議論の余地はありませんが、Webアプリケーションのクライアントで検証することが非常に重要だと思います。ユーザーに入力を直ちに解決させることができるときに、サーバーへのラウンドトリップが発生するのはなぜですか?このような目的のためにxValのような製品が存在します。 –

+0

@Sailing柔道 - 本当ですが、私はASP.NETなどの厳格なWebアプリケーションでMVVMをあまり使用していません。それは通常MVCです。 –

関連する問題