1

記事http://www.thekip.nl/2011/09/22/using-fluentvalidation-for-both-domain-validation-and-validation-in-mvc-projects/に続いて、私にとってはまだどこにあるのかはっきりしていません検証はアプリケーションに表示されます:クライアント側でModelState.IsValid?または、コントローラー内で使用できますか?

編集

Ok。したがって、与えられた例では

[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.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

ModelStateDinnerエンティティに対応しますか?

ありがとう!

4

1 に答える 1

2

ModelState常にモデルバインディングシステムに対応します。アクションが取得したパラメーター、およびそれをバインドする際の検証エラーについては、ModelStateデータが入力されます。ModelStateもちろんサーバー側であり、クライアント側でそれをチェックする方法はありません。実際にはコントローラーでのみ確認する必要があります。

例として投稿したパターンは、asp.netmvcで投稿リクエストを処理するための承認されたパターンです。最初のチェックでModelState.IsValidは、クライアントが投稿した値に検証エラーが含まれているかどうかについての情報が得られます。エラーが発生した場合は、クライアントが値を確認して修正するために入力された同じビューを返します。指定された値が有効な場合は、をModelState.IsValid返しtrue、リポジトリに保存しようとします。ただし、そのリポジトリは内部検証を追加で実行し、をスローする場合もありますFluentValidation.ValidationException。ここでcatchが必要です-その検証例外をキャッチしてに追加しModelState、MVCシステムがクライアントに検証エラーを表示できるようにします

少しキャッチを変更します

[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(ValidationException ex) 
        {
            ValidationResult result = new ValidationResult(ex.Errors);
            result.AddToModelState(ModelState, string.Empty);
        } 
    } 
    return View(dinner); 
} 
于 2012-01-25T07:16:46.643 に答える