如何在ASP MVC 4或5控制器中挂钩FluentValidation服务

时间:2014-02-06 08:43:36

标签: asp.net-mvc-4 asp.net-mvc-5 fluentvalidation

我正在使用FluentValidation并像我一样进行验证

[HttpPost]
    public ActionResult Create(CourseCategory category)
    {
        var result = new CourseCategoryValidator().Validate(category);
        try
        {
            if (result.IsValid)
            {
                _uow.CourseCategory.Insert(category);
                _uow.Commit();
                FlashMessage(category.Code + " - " + category.Name + " created!", Models.FlashMessageType.Success);

                return RedirectToAction("Index");
            }
            else
            {
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
                }
            }
        }
        catch (Exception)
        {
            ModelState.AddModelError("", "saving failed.");
        }

        return View(category);
    }

但它有点混乱,必须重复每一个需要验证的行动。

我的问题是,有没有办法在击中控制器之前挂钩验证?所以我可以调用if(validator.IsValid)然后如果验证失败,则会自动填充错误消息,因此我不必迭代它们。

1 个答案:

答案 0 :(得分:3)

你不应该做那么多。

FluentValidation支持MVC的模型绑定。 This document拥有您需要的一切:

  1. 通过NuGet安装相应的软件包。每个版本的MVC3,MVC4和MVC5都有不同的版本。
  2. 通过将FluentValidationModelValidatorProvider.Configure();添加到Global.asax文件来注册FluentValidation。
  3. 装饰您的模型类,使其包含模型的验证。您可能已经这样做了,已经考虑过您的验证工作正常。
  4. 将您的控制器更改为:

    [HttpPost]
    public ActionResult Create(CourseCategory category)
    {
        if (ModelState.IsValid)
        {
            _uow.CourseCategory.Insert(category);
            _uow.Commit();
            FlashMessage(category.Code + " - " + category.Name + " created!", Models.FlashMessageType.Success);
    
            return RedirectToAction("Index");
        }
        else
        {
            return View(category);
        }
    }
    
  5. 希望这有帮助!