【问题标题】:Using custom validators with Fluent Validation on ASP.NET Core 1.1在 ASP.NET Core 1.1 上使用具有 Fluent Validation 的自定义验证器
【发布时间】:2017-11-10 00:56:27
【问题描述】:

我无法让自定义验证器在客户端工作。在 ASP.NET MVC5 中,我曾经使用 Simple Injector 来注册验证器:

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 做同样的事情?

我已按照文档中提到使用 Microsoft 的 DI 进行注册:

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

但这有几个问题:

  • 无法让自定义验证器在客户端上工作(内置验证器效果很好)
  • 已经在 SimpleInjector 中注册的自定义验证器中使用的服务必须使用 Microsoft 的 DI 一个一个地再次注册。 services.AddTransient&lt;IUserRegistrationService, UserRegistrationService&gt;();

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core-mvc simple-injector fluentvalidation


    【解决方案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 Validation 时使用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 验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多