1

クライアント側で動作するカスタムバリデーターを取得できません。 JS側でこれらのメソッドを追加しますASP.NET Core 1.1でFluent Validationを使用したカスタムバリデータを使用

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

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

とすべてのカスタムバリデータを登録します。ASP.NET MVC5で、私はvalidatiorsを登録するシンプルインジェクタを使用するために使用されます

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ではどうすればよいですか?

私はMicrosoftのDIを使用して、それを登録するには言及ドキュメント続いています

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

をしかし、それはいくつかの問題があります。

  • は、カスタムバリデータは、クライアント上で動作させることはできませんが(組み込み既に有効なSimpleInjectorに登録されているカスタムバリデーター内で使用されるサービスは、MicrosoftのDIを使用して1つずつ再度登録する必要があります。 services.AddTransient<IUserRegistrationService, UserRegistrationService>();

答えて

1

これは古い記事ですが、私は、コア2とFluentValidation(7.2.1)を使用して、同様の問題/混乱していた私は、関連付けられた要素上にクライアント側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; 
    } 
} 

...クライアント側data-属性を供給し、その後IClientModelValidator実装...

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 Validationを登録するときには、ConfigureClientsideValidationメソッドを使用してください。

最後に、元の投稿にあるように、JSの検証を引き受けます。