2012-01-24 16 views
1

http://www.thekip.nl/2011/09/22/using-fluentvalidation-for-both-domain-validation-and-validation-in-mvc-projects/私の場合は、アプリケーションで検証がどこに表示されるのかはっきりしていません。クライアント側でModelState.IsValidを使用していますか?それとも、コントローラの中で使うことができますか? [OK]をASP.NET MVCでの検証。 FluentValidationModelProvider

EDIT

。だから、与えられた例えば

[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エンティティに対応しますか?

ありがとうございます!

答えて

2

ModelStateは常にモデル結合系に対応する。アクションを実行したパラメータとそれをバインドする際の検証エラーの場合は、ModelStateが入力されます。 ModelStateはもちろんサーバー側にあり、クライアント側で確認する方法はありません。実際にコントローラでのみチェックしてください。

例として投稿したパターンは、asp.net mvcで投稿要求を処理するための承認済みパターンです。 ModelState.IsValidの最初のチェックでは、クライアントが値のコーティング検証エラーを送信したかどうかの情報が表示されます。エラーがある場合は、クライアントが値をチェックして修正するために同じビューが移入されます。指定された値が有効な場合、ModelState.IsValidtrueを返し、リポジトリに保存しようとします。しかし、そのリポジトリも内部検証を追加してFluentValidation.ValidationExceptionを投げるかもしれません。あなたがキャッチを必要とするところです - その検証例外をキャッチし、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); 
} 
+0

[OK]をキャッチしています!ありがとう!それは明らかだった) – lexeme