FluentValidation 不使用我的规则

FluentValidation not using my Rules

我将 FluentValidation 与 Autofac 和 ValidatorFactoryBase 结合使用

当我执行我的项目时,我的验证器被执行,但是当我发送 post 我的规则没有被使用,但当前的验证器是我自己的验证器。

我的验证者:

public class UsuarioCadastrarValidator : AbstractValidator<UsuarioCadastrarVM>
{
    public UsuarioCadastrarValidator()
    {
        RuleFor(a => a.Nome).NotEmpty().WithMessage("Campo obrigatório");

        RuleFor(a => a.Nome).Length(4, 200).WithMessage("Digite seu nome completo");
    }
}

我的模特:

public class UsuarioCadastrarVM
{
    public string Nome { get; set; }
    public int CargoId { get; set; }
}

Global.asax(效果很好):

...
    FluentValidationModelValidatorProvider.Configure();


            var assembly = Assembly.GetExecutingAssembly();

            builder.RegisterAssemblyTypes(assembly)
                   .Where(t => t.Name.EndsWith("Validator"))
                   .AsImplementedInterfaces()
                   .InstancePerLifetimeScope();


            builder.RegisterAssemblyTypes(assembly);

            builder
            .RegisterType<FluentValidation.Mvc.FluentValidationModelValidatorProvider>()
            .As<ModelValidatorProvider>();

            builder.RegisterType<AutofacValidatorFactory>().As<IValidatorFactory>().SingleInstance();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
...

控制器(运行良好):

[HttpPost]
public ActionResult Cadastrar(UsuarioCadastrarVM vm)
{
      if(ModelState.IsValid)
      {

      }
}

我的 ValidatorFactoryBase(运行良好):

public class AutofacValidatorFactory : ValidatorFactoryBase
{
    private readonly IComponentContext _context;

    public AutofacValidatorFactory(IComponentContext context)
    {
        _context = context;
    }

    public override IValidator CreateInstance(Type validatorType)
    {
        object instance;
        if (_context.TryResolve(validatorType, out instance))
        {
            var validator = instance as IValidator;
            return validator;
        }

        return null;
    }
}

当我发送 Post 和 "Nome" 并且 "CargoId" 为空时,ModelState 中只有一条消息 "CargoId is required" 并且不存在该规则,我认为是因为 CargoId 是一个整数。

但是,为什么我的规则没有被考虑?

问题是 CargoId 是一个整数,所以 MVC 无法将我的 post 绑定到我的 ViewModel,因为在我的测试中我发送了一个空值,如果我将值发送到 CargoId 或更改为可为空 (int?),验证效果很好。