2012-01-24 43 views
1

對我來說,文章http://www.thekip.nl/2011/09/22/using-fluentvalidation-for-both-domain-validation-and-validation-in-mvc-projects/之後,仍然不清楚驗證在哪裏出現在應用程序中:在客戶端使用ModelState.IsValid?或者它可以在控制器內部使用?ASP.NET MVC中的驗證。 FluentValidationModelProvider

編輯

確定。因此,對於給定的例子

[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); 
} 

ModelState相當於Dinner實體?

謝謝!

回答

2

ModelState始終對應於模型綁定系統。對於您操作的任何參數以及綁定時的任何驗證錯誤,將填充ModelStateModelState當然是在服務器端,並且無法在客戶端檢查它。你應該並且只能在控制器中檢查它。

作爲示例發佈的模式是批准的模式,用於處理asp.net mvc中的發佈請求。首先檢查ModelState.IsValid是否向客戶提供了是否發佈了值cotain驗證錯誤的信息。如果出現錯誤,您將返回填充客戶端的相同視圖以檢查值並更正它們。如果提供的值有效,則ModelState.IsValid返回true,並嘗試將其保存到存儲庫。但是該存儲庫也可以另外進行內部驗證並丟棄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

好!謝謝!這很清楚) – lexeme