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驗證幾乎和原始文章中一樣。