gpt4 book ai didi

c# - 在 ASP.NET Core 1.1 上将自定义验证器与 Fluent Validation 结合使用

转载 作者:行者123 更新时间:2023-12-04 17:51:30 24 4
gpt4 key购买 nike

我无法让自定义验证器在客户端工作。在 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<IUserRegistrationService, UserRegistrationService>();

最佳答案

感谢这是一篇较旧的帖子,但我在使用 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 验证。

关于c# - 在 ASP.NET Core 1.1 上将自定义验证器与 Fluent Validation 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44350037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com