C# 自定义数据批注不起作用的不引人注目的验证

C# 自定义数据批注不起作用的不引人注目的验证,c#,model-view-controller,data-annotations,unobtrusive,validate.js,C#,Model View Controller,Data Annotations,Unobtrusive,Validate.js,我在.NETMVC5项目中遇到了一些自定义数据验证问题。我创建了自定义ValidateAgeAttribute.cs,其中包含一些自定义数据验证。我有一个customvalidation.js文件,我在其中添加了方法和适配器。不能让它工作。。。不开枪。其他验证(开箱即用)在同一表单上正常工作,不引人注目。它只在自定义的一个上失败。欢迎任何帮助或建议 提前谢谢 [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]

我在.NETMVC5项目中遇到了一些自定义数据验证问题。我创建了自定义ValidateAgeAttribute.cs,其中包含一些自定义数据验证。我有一个customvalidation.js文件,我在其中添加了方法和适配器。不能让它工作。。。不开枪。其他验证(开箱即用)在同一表单上正常工作,不引人注目。它只在自定义的一个上失败。欢迎任何帮助或建议

提前谢谢

 [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
    public class ValidateAgeAttribute : ValidationAttribute, IClientValidatable
    {
        private const string DefaultErrorMessage = "Your age is invalid, your {0} should fall between {1} and {2}";

        public DateTime MinimumDateProperty { get; private set; }
        public DateTime MaximumDateProperty { get; private set; }

        public ValidateAgeAttribute(
            int minimumAgeProperty,
            int maximumAgeProperty)
            : base(DefaultErrorMessage)
        {
            MaximumDateProperty = DateTime.Now.AddYears(minimumAgeProperty * -1);
            MinimumDateProperty = DateTime.Now.AddYears(maximumAgeProperty * -1);
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            DateTime datevalue;
            if (value != null)
            {
                if (DateTime.TryParse(value.ToString(), out datevalue))
                {
                    if (value != null)
                    {
                        DateTime parsedValue = (DateTime)datevalue;

                        if (parsedValue <= MinimumDateProperty || parsedValue >= MaximumDateProperty)
                        {
                            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
                        }
                    }
                }

            }
            return ValidationResult.Success;
        }
        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var rule = new ModelClientValidationRule()
            {
                ValidationType = "validateage",
                ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            };

            rule.ValidationParameters.Add("minumumdate", MinimumDateProperty.ToShortDateString());
            rule.ValidationParameters.Add("maximumdate", MaximumDateProperty.ToShortDateString());

            return new[] { rule };
        }

        public override string FormatErrorMessage(string name)
        {
            return string.Format(ErrorMessageString, name, MinimumDateProperty.ToShortDateString(), MaximumDateProperty.ToShortDateString());
        }
    }

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
公共类ValidateAgeAttribute:ValidationAttribute,IClientValidatable
{
private const string DefaultErrorMessage=“您的年龄无效,您的{0}应该介于{1}和{2}之间”;
public DateTime MinimumDateProperty{get;private set;}
公共DateTime MaximumDateProperty{get;private set;}
公共属性(
int minimumAgeProperty,
int maximumAgeProperty)
:base(DefaultErrorMessage)
{
MaximumDateProperty=DateTime.Now.AddYears(minimumAgeProperty*-1);
MinimumDateProperty=DateTime.Now.AddYears(maximumAgeProperty*-1);
}
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
日期时间日期值;
if(值!=null)
{
if(DateTime.TryParse(value.ToString(),out datevalue))
{
if(值!=null)
{
DateTime parsedValue=(DateTime)datevalue;
if(parsedValue=MaximumDateProperty)
{
返回新的ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
}
}
返回ValidationResult.Success;
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文)
{
var rule=new ModelClientValidationRule()
{
ValidationType=“validateage”,
ErrorMessage=FormatErrorMessage(metadata.GetDisplayName()),
};
rule.ValidationParameters.Add(“minumumdate”,MinimumDateProperty.ToShortDateString());
添加(“maximumdate”,MaximumDateProperty.ToShortDateString());
返回新的[]{rule};
}
公共重写字符串FormatErrorMessage(字符串名称)
{
返回string.Format(ErrorMessageString、name、MinimumDateProperty.ToShortDateString()、MaximumDateProperty.ToShortDateString());
}
}
js:

$(document).ready(function () {
    $.validator.addMethod(
        'validateage',
        function (value, element, params) {
            return this.optional(element) || (dateConverter(value) >= dateConverter(params.minumumdate) && dateConverter(value) <= dateConverter(params.maximumdate));
        });

    $.validator.unobtrusive.adapters.add(
        'validateage', ['minumumdate', 'maximumdate'], function (options) {
            var params = {
                minumumdate: options.params.minumumdate,
                maximumdate: options.params.maximumdate
            };
            options.rules['validateage'] = params;
            options.messages['validateage'] = options.message;
        });
});

function dateConverter(value) {
    var valueParts = value.split("/");
    return new Date(+valueParts[2], valueParts[1] - 1, +valueParts[0]);
}
$(文档).ready(函数(){
$.validator.addMethod(
“验证EAGE”,
函数(值、元素、参数){

返回此.optional(element)| |(dateConverter(value)>=dateConverter(params.minumDate)&&dateConverter(value)我发现了问题。我在与视图相关的js中调用了我的助手操作“revindvalidators”,但它很快就启动了,我将它放在validators添加之后。现在它可以工作了

$(document).ready(function () {
    // The validateage function
    $.validator.addMethod(
        'validateage',
        function (value, element, params) {
            return this.optional(element) || (dateConverter(value) >= dateConverter(params.minumumdate) && dateConverter(value) <= dateConverter(params.maximumdate));
        });

    $.validator.unobtrusive.adapters.add(
        'validateage', ['minumumdate', 'maximumdate'], function (options) {
            var params = {
                minumumdate: options.params.minumumdate,
                maximumdate: options.params.maximumdate
            };
            options.rules['validateage'] = params;
            options.messages['validateage'] = options.message;
    });

   helper.rebinvalidators();
});

function dateConverter(value) {
    var valueParts = value.split("/");
    return new Date(+valueParts[2], valueParts[1] - 1, +valueParts[0]);
}
<input class="form-control text-box single-line valid" data-val="true" data-val-validateage="Date de naissance incorrecte" data-val-validateage-maximumdate="07/01/2020" data-val-validateage-minumumdate="07/01/1925" id="Birthdate" name="Birthdate" type="text" value="" aria-describedby="Birthdate-error" aria-invalid="false">


$(document).ready(function () {
    // The validateage function
    $.validator.addMethod(
        'validateage',
        function (value, element, params) {
            return this.optional(element) || (dateConverter(value) >= dateConverter(params.minumumdate) && dateConverter(value) <= dateConverter(params.maximumdate));
        });

    $.validator.unobtrusive.adapters.add(
        'validateage', ['minumumdate', 'maximumdate'], function (options) {
            var params = {
                minumumdate: options.params.minumumdate,
                maximumdate: options.params.maximumdate
            };
            options.rules['validateage'] = params;
            options.messages['validateage'] = options.message;
    });

   helper.rebinvalidators();
});

function dateConverter(value) {
    var valueParts = value.split("/");
    return new Date(+valueParts[2], valueParts[1] - 1, +valueParts[0]);
}
   rebinvalidators: function() {
        var $form = $("#formId");
        $form.unbind();
        $form.data("validator", null);
        $.validator.unobtrusive.parse($form);
        $form.validate($form.data("unobtrusiveValidation").options);
    },