2016-09-09 2 views
0

j'utilise FluentValidation avec Autofac et ValidatorFactoryBaseFluentValidation ne pas utiliser mes règles

Quand j'exécute mon projet mon validateur est exécuté, mais quand j'envoyer un message mes règles n'est utilisé, mais le validateur actuel est ma propre Validator .

Mon Validator:

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"); 
    } 
} 

Mon modèle:

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

Global.asax (l'affaire):

... 
    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)); 
... 

Controller (Fonctionne bien):

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

     } 
} 

Mon ValidatorFactoryBase (Fonctionne bien):

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; 
    } 
} 

Lorsque j'envoie après avec « Nome » et « CargoId » vide ModelState n'a qu'un seul message « CargoId est nécessaire » et existe pas que la règle, je pense est parce que CargoId est un nombre entier.

Mais, pourquoi mes règles ne sont pas considérées?

+0

Basé [sur la documentation] (https://github.com/JeremySkinner/FluentValidation/wiki/h.-MVC), par défaut, il ne fera que câbler les validateurs en regardant le 'ValidatorAttribute' sur le modèle est en cours de validation. Vous ne semblez pas en avoir un, et vous ne semblez pas passer dans un paramètre personnalisé 'ValidatorFactory'. –

+0

débogage de mon ValidatorFactoryBase retourner le validateur correct et regarder ModelState le validateur en cours est le bon. –

+0

En outre, qu'est-ce que 'ViewModelValidator'? –

Répondre

0

Le problème était CargoId est un entier, de sorte que le MVC n'est pas en mesure de lier mon poste à mon ViewModel, parce que dans mes tests, j'ENVOYÉE une valeur vide, si j'envoie une valeur à CargoId ou modifier à annulable (int?) la validation fonctionne bien.