Остановить пользовательский валидатор от срабатывания при каждом нажатии клавиши - PullRequest
9 голосов
/ 11 февраля 2011

Я написал собственный валидатор, используя MVC DataAnnotations и ненавязчивую библиотеку javascript jQuery.Работает отлично.Единственная проблема, с которой я столкнулся сейчас, заключается в том, что после первоначальной проверки, если пользователь редактирует поле, он запускает валидатор при каждом нажатии клавиши.Поскольку валидатор подключается к веб-службе для проверки ввода, я бы предпочел, чтобы он всегда просто проверял ввод, когда пользователь покидает поле или отправляет форму.Есть ли способ изменить это поведение?Вот мой код:

<script type="text/javascript">
    $.validator.addMethod("validate_zipcode", function (value, element) {
        if (value == null || value.length == 0) {
            return true;
        }

        var isValid = false;
        $.ajax({
            async: false,
            dataType: "json",
            url: "/api/iszipvalid/" + value,
            success: function (response) {
                isValid = response;
            }
        });

        return isValid;
    });

    $.validator.unobtrusive.adapters.addBool('zipcode', 'validate_zipcode');
</script>

Ответы [ 2 ]

10 голосов
/ 12 февраля 2011

Я не положительный , это будет работать в сочетании с ASP.NET MVC (я покажу тестовый проект позже), но проверка позволяет вам устанавливать значения по умолчанию длявсе экземпляры проверки так:

$.validator.setDefaults({ onkeyup: false });

Если вы можете добавить эту строку до того, как MVC получит дескриптор на validate, она может работать, но отключит onkeyup для всех полей во всех формах (Судя по твоему посту, вроде бы все будет в порядке).

Надеюсь, это поможет.

3 голосов
/ 11 февраля 2011

Вы можете отменить запрос ajax перед началом нового. Ваш код может выглядеть примерно так:

<script type="text/javascript">
  var request = null;

  $.validator.addMethod("validate_zipcode", function (value, element) {
    if (value == null || value.length == 0) {
        return true;
    }

    if (request != null) {  
      request.abort();
    }

    var isValid = false;
    request = $.ajax({
        async: false,
        dataType: "json",
        url: "/api/iszipvalid/" + value,
        success: function (response) {
            isValid = response;
        }
    });

    return isValid;
  });

  $.validator.unobtrusive.adapters.addBool('zipcode', 'validate_zipcode');
</script>

Это то, что делает автозаполнение пользовательского интерфейса jquery, если вы посмотрите на вызовы, сделанные с помощью firebug.

...