永远不会使用 ValidatorFactoryBase 调用 AbstractValidator 的验证方法

Validate method of AbstractValidator never is called using ValidatorFactoryBase

我使用 FluentValidation 和 Autofac 实现了验证。

调用了CreateInstance,但是没有调用AbstractValidator的Validate方法,所以我的模型没有使用我的规则进行验证。

调试: 在 CreateInstance 中返回了正确的 AbstractValidator。

但是我在 Validate 中放置了断点并且没有被调用。

有想法吗?

我的代码:

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; //UsuarioCadastrarValidator is returned 
        }

        return null;
    }
}

public class UsuarioCadastrarValidator : AbstractValidator<UsuarioCadastrarVM>
{
    public UsuarioCadastrarValidator()
    {
        RuleFor(a => a.Nome).NotEmpty();

        RuleFor(a => a.Nome).Length(4, 200);

        ...
    }

    public override ValidationResult Validate(UsuarioCadastrarVM instance)
    {
        return base.Validate(instance); //breakpoint here not is called
    }

    public override IValidatorDescriptor CreateDescriptor()
    {
        return base.CreateDescriptor(); //breakpoint here IS called
    }

    public override ValidationResult Validate(ValidationContext<UsuarioCadastrarVM> context)
    {
        return base.Validate(context); //breakpoint here not is called
    }

    public override Task<ValidationResult> ValidateAsync(ValidationContext<UsuarioCadastrarVM> context, CancellationToken cancellation = default(CancellationToken))
    {
        return base.ValidateAsync(context, cancellation); //breakpoint here not is called
    }
}

UsuarioCadastrarVM 我有一个 属性 CargoId 类型 int

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