1

Je n'arrive pas à faire fonctionner les validateurs personnalisés du côté client. Dans le ASP.NET MVC5 j'utiliser Injector simple pour enregistrer validatiors:Utilisation de validateurs personnalisés avec Fluent Validation sur ASP.NET Core 1.1

var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); 
container.Register<IValidatorFactory, ApplicationValidatorFactory>(Lifestyle.Singleton); 
container.Register(typeof(IValidator<>), assemblies); 
container.RegisterConditional(typeof(IValidator<>), 
    typeof(ValidateNothingDecorator<>), 
    Lifestyle.Singleton, 
    context => !context.Handled); 

et enregistrer tous les validateurs personnalisés:

// Register Simple Injector validation factory in FV 
FluentValidationModelValidatorProvider.Configure(provider => 
{ 
    provider.ValidatorFactory = new ApplicationValidatorFactory(container); 
    provider.AddImplicitRequiredValidator = false; 
    provider.Add(typeof(UniqueEmailValidator), 
     (m, c, d, v) => new UniqueEmailPropertyValidator(m, c, d, v)); 
    provider.Add(typeof(UniqueUsernameValidator), 
     (m, c, d, v) => new UniqueUsernamePropertyValidator(m, c, d, v)); 
    provider.Add(typeof(StringNoSpacesValidator), 
     (m, c, d, v) => new StringNoSpacesPropertyValidator(m, c, d, v)); 
    provider.Add(typeof(PasswordStrengthValidator), 
     (m, c, d, v) => new PasswordStrengthPropertyValidator(m, c, d, v)); 
}); 

Ajouter ces méthodes sur le côté JS:

jQuery.validator.addMethod("nospaces", function(value, element) { 
    return value.indexOf(" ") < 0 && value != ""; 
    }, language.username_has_spaces); 

jQuery.validator.unobtrusive.adapters.add("nospaces", function (options) { 
    options.rules["nospaces"] = true; 
    if (options.message) { 
     options.messages["nospaces"] = options.message; 
    } 
}); 

jQuery.validator.unobtrusive.adapters.add("passwordmeter", function (options) { 
    options.rules["passwordmeter"] = true; 
    if (options.message) { 
     options.messages["passwordmeter"] = options.message; 
    } 
}); 

et c'est tout! Cela a fonctionné parfaitement!

Comment faire la même chose avec ASP.NET Core 1.1?

J'ai suivi la documentation qui mentionne pour l'enregistrer en utilisant le DI Microsoft:

services.AddMvc().AddFluentValidation(
    fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>()); 

Mais qui a plusieurs problèmes:

  • ne peut pas obtenir des validateurs sur mesure pour travailler sur le client (construit -dans ceux qui fonctionnent bien)
  • Les services utilisés à l'intérieur des validateurs personnalisés déjà enregistrés avec SimpleInjector doivent être recréés un par un en utilisant le DI de Microsoft. services.AddTransient<IUserRegistrationService, UserRegistrationService>();

Répondre

1

Appréciez c'est un ancien poste mais j'ai eu un problème similaire/confusion en utilisant FluentValidation (7.2.1) avec Core 2. Je ne pouvais pas comprendre comment obtenir côté client data- attributs sur des éléments associés à ma coutume PropertyValidator.

D'abord, je crée la mise en œuvre PropertyValidator ...

public class MyCustomValidator : PropertyValidator 
{ 
    public MyCustomValidator() 
     : base("{PropertyName} must do something.") { } 

    protected override bool IsValid(PropertyValidatorContext context) 
    { 
     // Removed for brevity 
     return true; 
    } 
} 

... puis la mise en œuvre IClientModelValidator pour alimenter le côté client data- attributs ...

public class MyCustomPropertyValidator : ClientValidatorBase, IClientModelValidator 
{ 
    public MyCustomPropertyValidator(PropertyRule rule, IPropertyValidator validator) 
     : base(rule, validator) 
    { 
    } 

    public override void AddValidation(ClientModelValidationContext context) 
    { 
     var validator = (MyCustomValidator)Validator; 

     MergeAttribute(context.Attributes, "data-val", "true"); 
     MergeAttribute(context.Attributes, "data-val-whatever", "..."); 

     // Add other attributes 
    } 
} 

... puis accrochez-le utilisez la méthode ConfigureClientsideValidation lors de l'enregistrement de la validation active ...

services 
.AddMvc() 
.AddFluentValidation(cfg => 
{ 
    cfg.ConfigureClientsideValidation(x => 
    { 
     x.Add(typeof(MyCustomValidator), (context, rule, validator) => new MyCustomPropertyValidator(rule, validator)); 
     // other types ... 
    }); 
    cfg.RegisterValidatorsFromAssemblyContaining<Startup>(); 
}); 

Enfin, accrochant la validation JS à peu près comme vous avez dans le message original.