19

ASP.NET MVCで検証を実装する方法に関するヒントのほとんどは、モデル(モデルとコントローラーの間にサービスレイヤーを構築するか、検証属性でモデルのプロパティを装飾する)に集中しているようです。

私のアプリケーションでは、コントローラーとビューの間のすべての通信にViewModelsを使用しています。

「EmailAddress」というプロパティを持つ「LoginViewModel」というログインページのViewModelがあります。

ユーザーが自分の電子メールアドレスを入力して[送信]をクリックすると、このViewModelが入力されてコントローラーに送信され、そこで電子メールアドレスが検証されます。

有効なメールアドレスである必要があり、ユーザーはシステムに登録されているドメインのユーザーである必要があります。

これに検証を追加する便利な方法は何でしょうか?検証をViewModel自体に入れる必要がありますか?それとも、コントローラーにとどまる必要がありますか?

4

2 に答える 2

5

「検証を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というツールに気づきました。まだ使用していませんが、この検証方法をサポートする必要があるようです。

于 2009-07-17T00:37:40.513 に答える
3

NerdDinnerチュートリアルでは、検証がモデルの部分クラス(つまり、LinqからSQLまたはEntity Framework)で発生することを示しています。ただし、ビューモデルを使用しているため、そこに検証ロジックを配置できます。

検証ロジックはコントローラーに組み込まれません。むしろ、ModelState.IsValidなどのチェックプロパティを使用してコントローラーからフックされます。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Dinner dinner) {

    if (ModelState.IsValid) {

        try {
            dinner.HostedBy = "SomeUser";

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new { id=dinner.DinnerID });
        }
        catch {
            ModelState.AddModelErrors(dinner.GetRuleViolations());
        }
    }

    return View(new DinnerFormViewModel(dinner));
}

詳細はこちら:

モデルの構築
http://nerddinnerbook.s3.amazonaws.com/Part3.htm

そしてここ:

ViewDataとViewModelhttp
://nerddinnerbook.s3.amazonaws.com/Part6.htm

于 2009-07-16T04:29:12.693 に答える