Проверка пользовательских аннотаций на стороне клиента не работает

#javascript #asp.net-mvc #jquery-validate #unobtrusive-validation

#javascript #asp.net-mvc #jquery-проверка #ненавязчивый -проверка

Вопрос:

Я пытаюсь заставить проверку на стороне клиента работать с пользовательскими аннотациями в 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; }
  

Атрибуты данных, по-видимому, генерируются так, как они должны:

 <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="">
  

Начинается проверка на стороне клиента, но я получаю «Неперехваченную ошибку типа: не удается прочитать свойство ‘call’ неопределенного» в jquery.validate.js

Это из «check: функция (элемент) …» в jquery.validate.js — переменная метода «не определена»:

jquery.validate.js , проверьте: функция (элемент) ...

Просмотр переменной rules объясняет, почему переменная метода не определена — по какой-то причине массив, содержащий параметры min и max, является «неопределенным» вместо имени «customstringlength»:

jquery.validate.js , проверьте: функция (элемент) ...

Но почему это «не определено»??

Вот мой customValidation.js , где я добавляю адаптер и т. Д:

 (function ($) {
    if ($.validator amp;amp; $.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;
}
  

Я слишком долго смотрел на это — чего мне не хватает??

Комментарии:

1. Пожалуйста, никогда не публикуйте изображения кода или изображения сообщений об ошибках. Публикуйте только фактический код или ошибку, чтобы этот контент был доступен для поиска.

Ответ №1:

Я наконец-то получил эту работу! Я решил не пытаться использовать «удобный» адаптер addMinMax, а вместо этого написать пользовательский адаптер. Вот обновленный customValidation.js (все остальное остается прежним):

 (function ($) {
    if ($.validator amp;amp; $.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));