多くの必須プロパティ(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で特に便利私が持っている他のプロジェクト、にそれを使用感じました。
これまでに優雅な解決策を見つけたことはありますか? –
@Andrew - 自分の解決策で質問を更新しました。完璧なルートではありませんが、最高の思い出になるでしょう。 –