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?
),验证效果很好。
我将 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?
),验证效果很好。