「検証をViewModel自体に配置する必要がありますか?それともコントローラーに保持する必要があります」Robertに同意しますが、自動化を追加するためのプラグを追加します。
xValなどのツールを見ると、データクラスのフィールドを装飾することで、ルーチンの検証(たとえば、必須フィールド、範囲内の数値、正規表現に一致する文字列)を自動的に実行できることがわかります。実際、xValは、クライアント側で実行されるように、ルーチン検証用のJavaScriptを自動的に作成できます。すべてコードを書かずに。より詳細な検証(たとえば、このユーザーはデータベースに登録されているドメインのメンバーですか?)は、モデルレイヤー自体の内部でサーバー側で行われます。
ViewModelイディオムを使用すると、このスキームにいくつかの課題が生じる可能性があります。私の現在のアプローチは、ビューモデル内にエンティティオブジェクトを埋め込むことです。
public class Contact {
[Required]
string Name { get; set; }
}
public class ContactView {
public Contact Contact { get; set; }
public string SomeOtherViewProperty { get; set; }
}
次に、コントローラーで、モデルを更新するときに浅い検証が行われます。
UpdateModel(contactViewModel.Contact, "Contact");
また、より多くの情報やより複雑な計算を必要とする検証は、モデルレイヤー自体の内部で行われます。
もう1つのアプローチは、エンティティオブジェクトを埋め込むのではなく、2つの間に個々のフィールドをマップすることです。最近、ドメインオブジェクトとビューモデルオブジェクトの間でフィールドを自動的にリンクするAutoMapperというツールに気づきました。まだ使用していませんが、この検証方法をサポートする必要があるようです。