ASP.NET MVC自定义验证程序不会触发

时间:2014-09-15 12:00:57

标签: asp.net-mvc unobtrusive-validation

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

服务器端:

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>

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

问题只是您没有定义适配器的规则部分。

尝试使用以下内容:

$.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验证器。名称是jQuery Validate规则的名称,值是jQuery Validate规则的参数值。

答案 2 :(得分:1)

您的自定义验证函数和适配器位于jQuery文档就绪函数中,这在此过程中为时已晚。我自己犯了同样的错误。

我修改了你的代码只是为了将设置包装在一个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>