Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript FluentValidation使用EqualValidator在客户端上验证复选框和密码_Javascript_Jquery_Validation_Checkbox_Fluentvalidation - Fatal编程技术网

Javascript FluentValidation使用EqualValidator在客户端上验证复选框和密码

Javascript FluentValidation使用EqualValidator在客户端上验证复选框和密码,javascript,jquery,validation,checkbox,fluentvalidation,Javascript,Jquery,Validation,Checkbox,Fluentvalidation,我实现了下面的代码,以便有一种方法来验证一个复选框,该复选框是由Darin Dimitrov发布的。它对复选框非常有效,但如果您还使用EqualValidator验证了密码和确认密码,则它不起作用。我想知道是否可以将自定义验证器更改为考虑复选框和密码验证。或者我需要为密码编写自定义验证程序吗 模型 验证器 public class MyViewModelValidator : AbstractValidator<MyViewModel> { public MyViewMode

我实现了下面的代码,以便有一种方法来验证一个复选框,该复选框是由Darin Dimitrov发布的。它对复选框非常有效,但如果您还使用EqualValidator验证了密码和确认密码,则它不起作用。我想知道是否可以将自定义验证器更改为考虑复选框和密码验证。或者我需要为密码编写自定义验证程序吗

模型

验证器

public class MyViewModelValidator : AbstractValidator<MyViewModel>
{
    public MyViewModelValidator()
    {
        RuleFor(x => x.IsChecked).Equal(true).WithMessage("Please check this checkbox");
    }
}
看法

jQuery

(function ($) {
    $.validator.unobtrusive.adapters.add('equaltovalue', ['valuetocompare'], function (options) {
        options.rules['equaltovalue'] = options.params;
        if (options.message != null) {
            options.messages['equaltovalue'] = options.message;
        }
    });

    $.validator.addMethod('equaltovalue', function (value, element, params) {
        if ($(element).is(':checkbox')) {
            if ($(element).is(':checked')) {
                return value.toLowerCase() === 'true';
            } else {
                return value.toLowerCase() === 'false';
            }
        }
        return params.valuetocompare.toLowerCase() === value.toLowerCase();
    });
})(jQuery);    

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/customadapter.js")" type="text/javascript"></script>
(函数($){
$.validator.unobtrusive.adapters.add('equaltovalue',['valuetocompare'],函数(选项){
options.rules['equaltovalue']=options.params;
如果(options.message!=null){
options.messages['equaltovalue']=options.message;
}
});
$.validator.addMethod('equaltovalue',函数(值、元素、参数){
if($(元素).is(':复选框')){
if($(元素).is(':checked')){
返回值.toLowerCase()='true';
}否则{
返回值.toLowerCase()='false';
}
}
返回params.valuetocompare.toLowerCase()==value.toLowerCase();
});
})(jQuery);

我知道这已经有几个月了,但我也遇到了同样的问题。我在Darin的原始线程中发布了一个解决方案->

这是:

首先,我用以下内容更新了javascript函数。

$.validator.addMethod('equaltovalue', function (value, element, params) {
    if ($(element).is(':checkbox')) {
        value = $(element).is(':checked') ? "true" : "false";
    }
    return params.valuetocompare.toLowerCase() === value.toLowerCase();
});
其次,我用以下内容更新了EqualToValueFluentValidationPropertyValidator:

public class EqualToValueFluentValidationPropertyValidator : FluentValidationPropertyValidator
{
    EqualValidator EqualValidator 
    {
        get { return (EqualValidator)Validator; }
    }

    public EqualToValueFluentValidationPropertyValidator(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator) : base(metadata, controllerContext, rule, validator) {
        ShouldValidate = false;
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
        if (!ShouldGenerateClientSideRules()) yield break;

        var propertyToCompare = EqualValidator.MemberToCompare as PropertyInfo;
        if(propertyToCompare != null) {
            // If propertyToCompare is not null then we're comparing to another property.
            // If propertyToCompare is null then we're either comparing against a literal value, a field or a method call.
            // We only care about property comparisons in this case.

            var comparisonDisplayName =
                ValidatorOptions.DisplayNameResolver(Rule.TypeToValidate, propertyToCompare, null)
                ?? propertyToCompare.Name.SplitPascalCase();

            var formatter = new MessageFormatter()
                .AppendPropertyName(Rule.GetDisplayName())
                .AppendArgument("ComparisonValue", comparisonDisplayName);


            string message = formatter.BuildMessage(EqualValidator.ErrorMessageSource.GetString());
            yield return new ModelClientValidationEqualToRule(message, CompareAttribute.FormatPropertyForClientValidation(propertyToCompare.Name)) ;
        }
        else
        {
            var validator = (EqualValidator)Validator;

            var errorMessage = new MessageFormatter()
                .AppendPropertyName(Rule.GetDisplayName())
                .AppendArgument("ValueToCompare", validator.ValueToCompare)
                .BuildMessage(validator.ErrorMessageSource.GetString());

            var rule = new ModelClientValidationRule();
            rule.ErrorMessage = errorMessage;
            rule.ValidationType = "equaltovalue";
            rule.ValidationParameters["valuetocompare"] = validator.ValueToCompare;
            yield return rule;
        }
    }
}
公共类EqualToValueFluentValidationPropertyValidator:FluentValidationPropertyValidator
{
等速校准器等速校准器
{
获取{return(EqualValidator)验证器;}
}
公共EqualToValueFluentValidationPropertyValidator(ModelMetadata元数据、ControllerContext ControllerContext、PropertyRule规则、IPropertyValidator验证器):基本(元数据、ControllerContext、规则、验证器){
ShouldValidate=false;
}
公共重写IEnumerable GetClientValidationRules(){
如果(!ShouldGenerateClientSideRules())产生中断;
var propertyToCompare=EqualValidator.MemberToCompare as PropertyInfo;
if(propertyToCompare!=null){
//如果propertyToCompare不为null,则我们将与另一个属性进行比较。
//如果propertyToCompare为null,则我们将与文本值、字段或方法调用进行比较。
//在这种情况下,我们只关心财产比较。
变量comparisonDisplayName=
ValidatorOptions.DisplayNameResolver(Rule.TypeToValidate,propertyToCompare,null)
??propertyToCompare.Name.SplitPascalCase();
var formatter=new MessageFormatter()
.AppendPropertyName(规则.GetDisplayName())
.AppendArgument(“ComparisonValue”,comparisonDisplayName);
string message=formatter.BuildMessage(EqualValidator.ErrorMessageSource.GetString());
返回新的ModelClientValidationQualtoRule(消息,CompareAttribute.FormatPropertyForClientValidation(propertyToCompare.Name));
}
其他的
{
var验证器=(EqualValidator)验证器;
var errorMessage=new MessageFormatter()
.AppendPropertyName(规则.GetDisplayName())
.AppendArgument(“ValueToCompare”,validator.ValueToCompare)
.BuildMessage(validator.ErrorMessageSource.GetString());
var rule=new ModelClientValidationRule();
rule.ErrorMessage=ErrorMessage;
rule.ValidationType=“equaltovalue”;
rule.ValidationParameters[“valuetocompare”]=validator.valuetocompare;
收益率-收益率规则;
}
}
}
用于FluentValidation v8

public class EqualToValueFluentValidationPropertyValidator : FluentValidationPropertyValidator
{
    EqualValidator EqualValidator
    {
        get { return (EqualValidator)Validator; }
    }

    public EqualToValueFluentValidationPropertyValidator(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator)
        : base(metadata, controllerContext, rule, validator)
    {
        ShouldValidate = false;
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        if (!ShouldGenerateClientSideRules())
            yield break;

        var propertyToCompare = EqualValidator.MemberToCompare as PropertyInfo;
        if (propertyToCompare != null)
        {
            // If propertyToCompare is not null then we're comparing to another property.
            // If propertyToCompare is null then we're either comparing against a literal value, a field or a method call.
            // We only care about property comparisons in this case.

            var comparisonDisplayName =
                ValidatorOptions.DisplayNameResolver(Rule.TypeToValidate, propertyToCompare, null)
                ?? propertyToCompare.Name.SplitPascalCase();

            var formatter = new MessageFormatter()
                .AppendPropertyName(Rule.GetDisplayName())
                .AppendArgument("ComparisonValue", comparisonDisplayName);


            string message;
            try
            {
                message = EqualValidator.Options.ErrorMessageSource.GetString(null);

            }
            catch (FluentValidationMessageFormatException)
            {
                // User provided a message that contains placeholders based on object properties. We can't use that here, so just fall back to the default. 
                message = ValidatorOptions.LanguageManager.GetStringForValidator<EqualValidator>();
            }
            message = formatter.BuildMessage(message);

#pragma warning disable 618
            yield return new ModelClientValidationEqualToRule(message, CompareAttribute.FormatPropertyForClientValidation(propertyToCompare.Name));
#pragma warning restore 618
        }
        else
        {
            var errorMessage = new MessageFormatter()
                .AppendPropertyName(Rule.GetDisplayName())
                .AppendArgument("ValueToCompare", EqualValidator.ValueToCompare)
                .BuildMessage(EqualValidator.Options.ErrorMessageSource.GetString(null));

            var rule = new ModelClientValidationRule
            {
                ErrorMessage = errorMessage,
                ValidationType = "equaltovalue"
            };
            rule.ValidationParameters["valuetocompare"] = EqualValidator.ValueToCompare;
            yield return rule;
        }
    }
}
公共类EqualToValueFluentValidationPropertyValidator:FluentValidationPropertyValidator
{
等速校准器等速校准器
{
获取{return(EqualValidator)验证器;}
}
公共EqualToValueFluentValidationPropertyValidator(ModelMetadata元数据、ControllerContext ControllerContext、PropertyRule规则、IPropertyValidator验证器)
:base(元数据、controllerContext、规则、验证器)
{
ShouldValidate=false;
}
公共重写IEnumerable GetClientValidationRules()
{
如果(!ShouldGenerateClientSideRules())
屈服断裂;
var propertyToCompare=EqualValidator.MemberToCompare as PropertyInfo;
if(propertyToCompare!=null)
{
//如果propertyToCompare不为null,则我们将与另一个属性进行比较。
//如果propertyToCompare为null,则我们将与文本值、字段或方法调用进行比较。
//在这种情况下,我们只关心财产比较。
变量comparisonDisplayName=
ValidatorOptions.DisplayNameResolver(Rule.TypeToValidate,propertyToCompare,null)
??propertyToCompare.Name.SplitPascalCase();
var formatter=new MessageFormatter()
.AppendPropertyName(规则.GetDisplayName())
.AppendArgument(“ComparisonValue”,comparisonDisplayName);
字符串消息;
尝试
{
message=EqualValidator.Options.ErrorMessageSource.GetString(null);
}
捕获(FluentValidationMessageFormatException)
{
//用户提供了一条包含基于对象属性的占位符的消息。我们无法在此处使用该占位符,所以请返回默认值。
message=ValidatorOptions.LanguageManager.GetStringForValidator();
}
message=formatter.BuildMessage(消息);
#pragma警告禁用618
产生并返回新的ModelClientValidationQualtoRule(消息,CompareAtt
FluentValidationModelValidatorProvider.Configure(provider =>
{
    provider.AddImplicitRequiredValidator = false;
    provider.Add(typeof(EqualValidator), (metadata, context, description, validator) => new EqualToValueFluentValidationPropertyValidator(metadata, context, description, validator));
});
(function ($) {
    $.validator.unobtrusive.adapters.add('equaltovalue', ['valuetocompare'], function (options) {
        options.rules['equaltovalue'] = options.params;
        if (options.message != null) {
            options.messages['equaltovalue'] = options.message;
        }
    });

    $.validator.addMethod('equaltovalue', function (value, element, params) {
        if ($(element).is(':checkbox')) {
            if ($(element).is(':checked')) {
                return value.toLowerCase() === 'true';
            } else {
                return value.toLowerCase() === 'false';
            }
        }
        return params.valuetocompare.toLowerCase() === value.toLowerCase();
    });
})(jQuery);    

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/customadapter.js")" type="text/javascript"></script>
$.validator.addMethod('equaltovalue', function (value, element, params) {
    if ($(element).is(':checkbox')) {
        value = $(element).is(':checked') ? "true" : "false";
    }
    return params.valuetocompare.toLowerCase() === value.toLowerCase();
});
public class EqualToValueFluentValidationPropertyValidator : FluentValidationPropertyValidator
{
    EqualValidator EqualValidator 
    {
        get { return (EqualValidator)Validator; }
    }

    public EqualToValueFluentValidationPropertyValidator(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator) : base(metadata, controllerContext, rule, validator) {
        ShouldValidate = false;
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
        if (!ShouldGenerateClientSideRules()) yield break;

        var propertyToCompare = EqualValidator.MemberToCompare as PropertyInfo;
        if(propertyToCompare != null) {
            // If propertyToCompare is not null then we're comparing to another property.
            // If propertyToCompare is null then we're either comparing against a literal value, a field or a method call.
            // We only care about property comparisons in this case.

            var comparisonDisplayName =
                ValidatorOptions.DisplayNameResolver(Rule.TypeToValidate, propertyToCompare, null)
                ?? propertyToCompare.Name.SplitPascalCase();

            var formatter = new MessageFormatter()
                .AppendPropertyName(Rule.GetDisplayName())
                .AppendArgument("ComparisonValue", comparisonDisplayName);


            string message = formatter.BuildMessage(EqualValidator.ErrorMessageSource.GetString());
            yield return new ModelClientValidationEqualToRule(message, CompareAttribute.FormatPropertyForClientValidation(propertyToCompare.Name)) ;
        }
        else
        {
            var validator = (EqualValidator)Validator;

            var errorMessage = new MessageFormatter()
                .AppendPropertyName(Rule.GetDisplayName())
                .AppendArgument("ValueToCompare", validator.ValueToCompare)
                .BuildMessage(validator.ErrorMessageSource.GetString());

            var rule = new ModelClientValidationRule();
            rule.ErrorMessage = errorMessage;
            rule.ValidationType = "equaltovalue";
            rule.ValidationParameters["valuetocompare"] = validator.ValueToCompare;
            yield return rule;
        }
    }
}
public class EqualToValueFluentValidationPropertyValidator : FluentValidationPropertyValidator
{
    EqualValidator EqualValidator
    {
        get { return (EqualValidator)Validator; }
    }

    public EqualToValueFluentValidationPropertyValidator(ModelMetadata metadata, ControllerContext controllerContext, PropertyRule rule, IPropertyValidator validator)
        : base(metadata, controllerContext, rule, validator)
    {
        ShouldValidate = false;
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        if (!ShouldGenerateClientSideRules())
            yield break;

        var propertyToCompare = EqualValidator.MemberToCompare as PropertyInfo;
        if (propertyToCompare != null)
        {
            // If propertyToCompare is not null then we're comparing to another property.
            // If propertyToCompare is null then we're either comparing against a literal value, a field or a method call.
            // We only care about property comparisons in this case.

            var comparisonDisplayName =
                ValidatorOptions.DisplayNameResolver(Rule.TypeToValidate, propertyToCompare, null)
                ?? propertyToCompare.Name.SplitPascalCase();

            var formatter = new MessageFormatter()
                .AppendPropertyName(Rule.GetDisplayName())
                .AppendArgument("ComparisonValue", comparisonDisplayName);


            string message;
            try
            {
                message = EqualValidator.Options.ErrorMessageSource.GetString(null);

            }
            catch (FluentValidationMessageFormatException)
            {
                // User provided a message that contains placeholders based on object properties. We can't use that here, so just fall back to the default. 
                message = ValidatorOptions.LanguageManager.GetStringForValidator<EqualValidator>();
            }
            message = formatter.BuildMessage(message);

#pragma warning disable 618
            yield return new ModelClientValidationEqualToRule(message, CompareAttribute.FormatPropertyForClientValidation(propertyToCompare.Name));
#pragma warning restore 618
        }
        else
        {
            var errorMessage = new MessageFormatter()
                .AppendPropertyName(Rule.GetDisplayName())
                .AppendArgument("ValueToCompare", EqualValidator.ValueToCompare)
                .BuildMessage(EqualValidator.Options.ErrorMessageSource.GetString(null));

            var rule = new ModelClientValidationRule
            {
                ErrorMessage = errorMessage,
                ValidationType = "equaltovalue"
            };
            rule.ValidationParameters["valuetocompare"] = EqualValidator.ValueToCompare;
            yield return rule;
        }
    }
}