2012-01-24 42 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