gpt4 book ai didi

c# - FluentValidation 中每个自定义规则的客户端验证的最佳方法

转载 作者:太空狗 更新时间:2023-10-30 01:34:38 24 4
gpt4 key购买 nike

我在我的 Asp.Net MVC 4 应用程序中使用 FluentValidation。我已经知道一些规则会自动为 jQuery 验证库生成属性。并且这个脚本库已经知道它必须检查什么,例如在 data-rule-requireddata-rule-range 等情况下。

我知道 FluentValidation 中有一些函数,但这些函数不包含在客户端。例如:.Equal(true)。我检查了@DarinDimitrov回答here并毫无问题地实现了这一点。

但是,我不想总是创建继承自 FluentValidationPropertyValidator 的新类。我们必须像在 global.asax 中那样将其添加到提供程序中:

provider.Add(typeof(EqualValidator), (metadata, context, description, validator) => new EqualToValueClientRule(metadata, context, description, validator));

在这种情况下,EqualValidator 已在 FluentValidation 中实现。但是,如果我们创建了一个带有 When 关键字的验证器呢?例如,我有:

this.RuleFor(phone => phone.Digits)
.Length(7)
.When(phone => phone.PrefixId == 2)
.WithMessage("Numbers in 2nd city must contain 7 characters");

this.RuleFor(phone => phone.Digits)
.Length(7)
.When(phone => phone.PrefixId > 64)
.WithMessage("Mobile number must contain 7 characters");

this.RuleFor(phone => phone.Digits)
.Length(5)
.When(phone => phone.PrefixId != 2)
.WithMessage("Numbers in other cities must contain 5 characters")

当然,我可以毫无问题地使用 jQuery/JavaScript 检查它。但是,这种做法并不好。在其他情况下,您必须编写大量代码才能在客户端生成自定义属性并向适配器添加新功能。或者,只使用 jQuery/JavaScript?或者其他什么?我们可以将 JavaScript 函数名称添加到 FluentValidationPropertyValidator 吗?

你有什么推荐给我的?

最佳答案

我想了很多,发现最好的方法是创建新的验证器,它继承自 PropertyValidator 并实现 IClientValidatable 接口(interface)。因此,它将包含服务器端验证,并将按照我们的意愿生成不显眼的属性。然后我们必须需要在不显眼的库中注册这个新的验证器。

例如,我的问题中规则的验证器将是:

public class MustFitToPhonePrefix<TModel, TProperty> : PropertyValidator, IClientValidatable
{
private string dependencyElement;

public MustFitToPhonePrefix(Expression<Func<TModel, TProperty>> expression)
: base("Format is wrong")
{
dependencyElement = (expression.Body as MemberExpression).Member.Name;
}

// Server side validation
protected override bool IsValid(PropertyValidatorContext context)
{
// Instance of the class which contains property which must be validated
var phone = context.ParentContext.InstanceToValidate as PhoneDetail;

...
// Custom logic
...

// Everything is valid
return true;
}

// Generate jquery unobtrusive attributes
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = this.ErrorMessageSource.GetString(), // default error message
ValidationType = "fittoprefix" // name of the validatoin which will be used inside unobtrusive library
};

rule.ValidationParameters["prefixelement"] = dependencyElement; // html element which includes prefix information
yield return rule;
}

现在我们可以注册我们的客户端验证器了:

// Will check if the phone number fits to phone prefix
$.validator.addMethod('fittoprefix', function (value, element, params) {
var parent = getParentPropertyName(element);
var prefixId = $("#{0}_{1}".format(parent, params.prefixelement)).val();
var digitsLength = $(element).val().Length;

...
// Custom logic
...

return true;
});

// Registration - Will check if the phone number fits to phone prefix
$.validator.unobtrusive.adapters.add('fittoprefix', ['prefixelement'], function (options) {
options.rules['fittoprefix'] = options.params;
if (options.message != null) {
options.messages['fittoprefix'] = options.message;
}
});

最后,我们可以设置我们的验证器:

   this.RuleFor(m => m.Digits)
.SetValidator(new MustFitToPhonePrefix<PhoneDetail, int>(m => m.PrefixId));

关于c# - FluentValidation 中每个自定义规则的客户端验证的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29912898/

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