16

これが土地の配置です。ほとんどの人と同じように、私はドメイン オブジェクトとビュー モデルを持っています。ビジネス オブジェクトを変更する必要なく、特定のビュー コンテキスト専用のモデルを作成できるため、ビュー モデルを使用するというアイデアが気に入っています。

私が抱えている問題は、ドメイン オブジェクトで定義されたタイプ レベルの検証と、それらのルールをクライアントに取得することです。この場合、データ注釈を使用して検証ルールを記述しているとしましょう。データをドメイン オブジェクトからビュー モデルに移動すると、ビュー モデルはインターフェースに実行させるべき検証を認識しなくなります (検証がドメインオブジェクトで定義されています)。

MVC 2 を使用すると、現在のオブジェクトの検証規則に基づいて、クライアント/サーバー側の検証を自動的に実行できます。しかし、検証ルールはビュー モデルではなくドメイン オブジェクトで定義されるため、これを機能させるには、ビュー モデルで検証ルールを複製する必要があります。

他の人はこの種の問題にどのように対処していますか? 私の考えでは、データをドメイン オブジェクトからビュー モデルにマッピングするだけでなく、検証ルール全体にもマッピングする必要がありますが、この問題について他の人が話しているのを見たことがありません... Brad Wilson が最近この問題について話しましたしかし、ドメインオブジェクトとビューモデルのルールの重複については実際には対処していません...どう思いますか?

乾杯アンソニー

4

5 に答える 5

3

DataAnnotation 属性は、入力を検証し、UI フィードバックをエンド ユーザーに提供するためのものです。それは本当に彼らの唯一の意図された使用です. 私は UI オブジェクトとビジネス オブジェクトに対して異なる検証戦略を使用しているため、DA 検証属性はユーザーに表示されるモデルにのみ適用されます。

于 2010-02-06T17:48:06.207 に答える
2

AutoMapper はこれを自動的に実行できる可能性があることがわかりました。これが最良のシナリオです。

AutoMapper-users: 検証属性をビューモデルに転送しますか?
http://groups.google.com/group/automapper-users/browse_thread/thread/efa1d551e498311c/db4e7f6c93a77302?lnk=gst&q=validation#db4e7f6c93a77302

そこで提案された解決策を試すことはできませんでしたが、すぐに試すつもりです。

(クロスはこれを私の(だまされた)質問にも投稿しました)。

于 2010-02-20T11:09:18.620 に答える
2

これは適切ではないかもしれませんが、検証ルール/注釈をモデルから ViewModel に移動した場合はどうなるでしょうか? 私がこれまで取り組んできたいくつかのプロジェクトでは、対応する ViewModel を通じて公開された情報以外に View がアクセスできないようにすることを選択しました。すべてのデータ操作は ViewModel を介して実行されるため、モデル オブジェクトを検証する必要はありません。

この引数に対する反論は、異なる ViewModel が同じモデルとインターフェイスしている可能性があるため、特定の検証ルールを簡単に複製できるということです。この場合、Model を ViewModel で公開されるプロパティとして単純に宣言するのが理にかなっています。ポストバックの場合、ModelBinder インフラストラクチャが要求を処理できるように、モデルをパラメーターとして受け入れることができます。この場合、ModelState.IsValid が false であれば、View を再表示する前に、プロパティを ViewModel に再割り当てできます。

注釈を ViewModel に移動することをお勧めします。多くのビューは、a) 複数のモデルの構成の結果、または b) モデル データのサブセットであるため、これは理にかなっています。

于 2010-02-02T08:07:23.660 に答える
0

私もしばらくこれを検討してきました。私はブラッドの返事を完全に理解しています。ただし、ドメインエンティティとビューモデルの両方に注釈を付けるのに適した別の検証フレームワークを使用したいとします。

私が紙の上で思いつくことができる唯一の解決策は、まだ属性で機能しますが、ビューモデルでミラーリングしているドメインエンティティのプロパティを「指す」別の属性を作成することです。次に例を示します。

// In UI as a view model.
public class UserRegistration {
  [ValidationDependency<Person>(x => x.FirstName)]
  public string FirstName { get; set; }

  [ValidationDependency<Person>(x => x.LastName)]
  public string LastName { get; set; }

  [ValidationDependency<Membership>(x => x.Username)]
  public string Username { get; set; }

  [ValidationDependency<Membership>(x => x.Password)]
  public string Password { get; set; }
}

xValのようなフレームワークは、この新しい属性を処理し、依存関係クラスのプロパティで検証属性を実行するように拡張できますが、ビューモデルのプロパティ値を使用します。これをもっと具体化する時間がなかっただけです。

何かご意見は?

于 2010-02-17T23:43:18.887 に答える
0

おそらく、ビューモデルをまったく使用すべきではありませんか?そして、モデルレイヤーエンティティに検証ルールを定義します。

于 2010-02-02T12:24:55.577 に答える