Asp.net mvc ASP.NET MVC自定义验证程序未触发

Asp.net mvc ASP.NET MVC自定义验证程序未触发,asp.net-mvc,unobtrusive-validation,Asp.net Mvc,Unobtrusive Validation,我正在尝试为我的ASP.NET MVC viewmodel编写一个非常简单的数据注释验证程序。当应用于datetime字段时,验证程序必须检查日期的年份是否为当前年份。服务器端按预期工作,但客户端似乎不会触发(其他验证器,如范围或所需工作) 服务器端: class CurrentYearAttribute : ValidationAttribute, IClientValidatable { public override bool IsValid(object value) {

我正在尝试为我的ASP.NET MVC viewmodel编写一个非常简单的数据注释验证程序。当应用于datetime字段时,验证程序必须检查日期的年份是否为当前年份。服务器端按预期工作,但客户端似乎不会触发(其他验证器,如范围或所需工作)

服务器端:

class CurrentYearAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if(value == null)
        {
            return false;
        }

        var date = (DateTime)value;

        return (date.Year == DateTime.Now.Year);

    }

    public override string FormatErrorMessage(string name)
    {
        return "Le champ " + name + " doit être de l'année en cours.";
    }

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

        yield return rule;

    }
}
<script type="text/javascript">
        $(document).ready(function () {
            $.validator.addMethod(
                'currentyear',
                function (value, element, params) {
                    alert("hello"); // never 
                    return (Date.parse(value).getFullYear() == (new Date()).getFullYear());
                });

            $.validator.unobtrusive.adapters.addBool("currentyear");

            //$.validator.unobtrusive.parse("form");
        });
</script>
class CurrentYearAttribute:ValidationAttribute,IClientValidable
{
公共覆盖布尔值有效(对象值)
{
如果(值==null)
{
返回false;
}
变量日期=(日期时间)值;
return(date.Year==DateTime.Now.Year);
}
公共重写字符串FormatErrorMessage(字符串名称)
{
返回“lechamp”+name+“doitêtre de l'année en cours.”;
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文)
{
var rule=new ModelClientValidationRule()
{
ValidationType=“当前年份”,
ErrorMessage=FormatErrorMessage(metadata.GetDisplayName()),
};
收益率-收益率规则;
}
}
客户端:

class CurrentYearAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if(value == null)
        {
            return false;
        }

        var date = (DateTime)value;

        return (date.Year == DateTime.Now.Year);

    }

    public override string FormatErrorMessage(string name)
    {
        return "Le champ " + name + " doit être de l'année en cours.";
    }

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

        yield return rule;

    }
}
<script type="text/javascript">
        $(document).ready(function () {
            $.validator.addMethod(
                'currentyear',
                function (value, element, params) {
                    alert("hello"); // never 
                    return (Date.parse(value).getFullYear() == (new Date()).getFullYear());
                });

            $.validator.unobtrusive.adapters.addBool("currentyear");

            //$.validator.unobtrusive.parse("form");
        });
</script>

$(文档).ready(函数(){
$.validator.addMethod(
“本年度”,
函数(值、元素、参数){
警惕(“你好”);//从不
return(Date.parse(value).getFullYear()==(newdate()).getFullYear());
});
$.validator.unobtrusive.adapters.addBool(“当前年度”);
//$.validator.unobtrusive.parse(“表单”);
});

我认为您需要在
$(文档)之前调用
$.validator.addMethod()
$.validator.unobtrusive.adapters.addBool
。如果表单元素是动态插入的,您需要在每个元素上调用
$.validator.unobtrusive.parse
$.validator.unobtrusive.parseElement

我认为您需要在
之前调用
$.validator.addMethod()
$.validator.unobtrusive.adapters.addBool
$(document).ready
。如果动态插入表单元素,则需要在每个元素上调用
$.validator.unobtrusive.parse
$.validator.unobtrusive.parseElement

问题在于您没有定义适配器的规则部分

尝试使用类似以下内容:

$.validator.unobtrusive.adapters.addBool("currentyear", function (options) {
    options.rules["currentyear"] = "#" + options.element.name.replace('.', '_'); // mvc html helpers
    options.messages["currentyear"] = options.message;
});
关于规则:


此HTML元素的jQuery规则数组。适配器应添加项要附加的特定jQuery验证验证程序的规则数组。名称是jQuery验证规则的名称,值是jQuery验证规则的参数值。

问题在于您尚未定义适配器的规则部分

尝试使用类似以下内容:

$.validator.unobtrusive.adapters.addBool("currentyear", function (options) {
    options.rules["currentyear"] = "#" + options.element.name.replace('.', '_'); // mvc html helpers
    options.messages["currentyear"] = options.message;
});
关于规则:


此HTML元素的jQuery规则数组。适配器应添加项要附加的特定jQuery Validate Validator的此规则数组。名称是jQuery Validate规则的名称,值是jQuery Validate规则的参数值。

您的自定义验证函数和适配器位于jQuery document ready函数中,该过程太晚了。我将此设置为我错了

我修改了您的代码,只是为了将设置包装在JavaScript闭包中,并传入别名为$的jQuery对象

<script type="text/javascript">
        (function ($) {
            $.validator.addMethod(
                'currentyear',
                function (value, element, params) {
                    alert("hello"); // never 
                    return (Date.parse(value).getFullYear() == (new Date()).getFullYear());
                });

            $.validator.unobtrusive.adapters.addBool("currentyear");

            //$.validator.unobtrusive.parse("form");
        } (jQuery));
</script>

(函数($){
$.validator.addMethod(
“本年度”,
函数(值、元素、参数){
警惕(“你好”);//从不
return(Date.parse(value).getFullYear()==(newdate()).getFullYear());
});
$.validator.unobtrusive.adapters.addBool(“当前年度”);
//$.validator.unobtrusive.parse(“表单”);
}(jQuery));

您的自定义验证函数和适配器位于jQuery document ready函数中,这在过程中太晚了。我自己也犯了同样的错误

我修改了您的代码,只是为了将设置包装在JavaScript闭包中,并传入别名为$的jQuery对象

<script type="text/javascript">
        (function ($) {
            $.validator.addMethod(
                'currentyear',
                function (value, element, params) {
                    alert("hello"); // never 
                    return (Date.parse(value).getFullYear() == (new Date()).getFullYear());
                });

            $.validator.unobtrusive.adapters.addBool("currentyear");

            //$.validator.unobtrusive.parse("form");
        } (jQuery));
</script>

(函数($){
$.validator.addMethod(
“本年度”,
函数(值、元素、参数){
警惕(“你好”);//从不
return(Date.parse(value).getFullYear()==(newdate()).getFullYear());
});
$.validator.unobtrusive.adapters.addBool(“当前年度”);
//$.validator.unobtrusive.parse(“表单”);
}(jQuery));