【问题标题】:Client-side custom annotation validation not working客户端自定义注释验证不起作用
【发布时间】:2014-06-19 03:03:24
【问题描述】:

我正在尝试使用 ASP.NET MVC 应用程序中的自定义注释进行客户端验证。抱歉,这篇文章有点冗长。

这是自定义属性:

public class CustomStringLengthAttribute : ValidationAttribute, IClientValidatable
{
    public int MaxLength { get; private set; }
    public int MinLength { get; set; }

    public CustomStringLengthAttribute(int maxLength)
        : base(GetDefaultErrorMessage)
    {
        MaxLength = maxLength;
    }

    private static string GetDefaultErrorMessage()
    {
        return "Max length {1}";
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, name, MaxLength, MinLength);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        ...

        if (length > MaxLength || length < MinLength)
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));

        return ValidationResult.Success;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
        rule.ValidationType = "customstringlength";
        rule.ValidationParameters.Add("max", MaxLength);
        rule.ValidationParameters.Add("min", MinLength);

        yield return rule;
    }
}

我在我的视图模型中使用该属性:

[CustomStringLength(25)]
public virtual string BillAddress1 { get; set; }

data- 属性似乎是按应有的方式生成的:

<input data-val="true" data-val-customstringlength="Max length 25" data-val-customstringlength-max="25" data-val-customstringlength-min="0" id="BillAddress1" name="BillAddress1" type="text" value="">

客户端验证启动,但我在 jquery.validate.js 中收到“未捕获的类型错误:无法读取未定义的属性‘调用’”

这是来自 jquery.validate.js 中的“check: function(element) ...” - 方法变量是“undefined”:

查看规则变量可以解释为什么方法变量是未定义的——出于某种原因,包含 min 和 max 参数的数组是“未定义的”而不是命名为“customstringlength”:

但为什么它是“未定义的”??

这是我的 customValidation.js,我在其中添加了适配器等:

(function ($) {
    if ($.validator && $.validator.unobtrusive) {

        $.validator.unobtrusive.adapters.addMinMax("customstringlength", "min", "max");

        $.validator.addMethod("customstringlength", function (value, element, min, max) {
            if (value) {
                if (value.length < min || value.length > max) {
                    return false;
                }
            }
            return true;
        });
    }
}(jQuery));

这里是我调用表单验证的地方:

function validateForm(form) {
    prepareValidationScripts(form);
    var validator = $.data(form[0], 'validator');
    return validator.form();
}

function prepareValidationScripts(form) {
    if (form.executed)
        return;
    form.removeData("validator");
    $.validator.unobtrusive.parse(document);
    form.executed = true;
}

我已经盯着这个太久了 - 我错过了什么??

【问题讨论】:

  • 请不要张贴代码图片或错误消息图片。仅发布实际代码或错误,以便此内容可搜索。

标签: javascript asp.net-mvc jquery-validate unobtrusive-validation


【解决方案1】:

我终于搞定了!我决定不尝试使用“方便”的 addMinMax 适配器,而是编写一个自定义适配器。这是更新后的 customValidation.js(其他一切都保持不变):

(function ($) {
    if ($.validator && $.validator.unobtrusive) {

        $.validator.unobtrusive.adapters.add('customstringlength', ['min', 'max'], function(options) {
            options.rules['customstringlength'] = {
                min: options.params.min,
                max: options.params.max,
            };
            options.messages['customstringlength'] = options.message;
        });

        $.validator.addMethod('customstringlength', function (value, element, params) {
            if (value) {
                if (value.length < params.min || value.length > params.max) {
                    return false;
                }
            }
            return true;
        });
    }
}(jQuery));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多