1

在文章http://www.thekip.nl/2011/09/22/using-fluentvalidation-for-both-domain-validation-and-validation-in-mvc-projects/之后,我还不清楚验证出现在应用程序中:在客户端使用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.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

ModelState对应一个Dinner实体?

谢谢!

4

1 回答 1

2

ModelState始终对应模型绑定系统。对于您的操作获得的任何参数,以及绑定它时的任何验证错误,ModelState都会被填充。ModelState当然是在服务器端,没有办法在客户端检查它。实际上,您应该并且只能在控制器中检查它。

您作为示例发布的模式是在 asp.net mvc 中处理发布请求的批准模式。首先检查为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 回答