1

我无法获得自定义验证器以在客户端工作。在ASP.NET MVC5我用简单的注射器注册validatiors:在ASP.NET Core 1.1上使用自定义验证器和Fluent验证

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

并注册所有自定义验证:

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

添加这些方法在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; 
    } 
}); 

就是这样!它完美无缺地工作!

如何在ASP.NET Core 1.1中执行相同的操作?

我按照说明文件,其中提到使用微软的DI注册它:

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

但是,有几个问题:

  • 不能得到自定义验证客户端上运行(内置 - 在工作很好)
  • 已在SimpleInjector中注册的自定义验证程序中使用的服务必须使用Microsoft的DI一个接一个地重新注册。 services.AddTransient<IUserRegistrationService, UserRegistrationService>();

回答

1

明白这是一个老的文章,但我不得不使用FluentValidation(7.2.1)采用Core 2。我无法弄清楚如何获得客户端data-属性到具有相关联的元素类似的问题/混乱我的自定义PropertyValidator

首先,我创建了PropertyValidator实现...

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

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

...那么IClientModelValidator实施提供客户端data-属性...

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

...然后在注册Fluent验证时使用ConfigureClientsideValidation方法将其挂起...

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

最后,连接JS验证几乎和原始文章中一样。