Ненавязчивая проверка MVC всегда показывает сообщение - PullRequest
1 голос
/ 03 ноября 2011

Я довольно новичок в создании настраиваемой ненавязчивой проверки и столкнулся со странной проблемой.

Эта проверка в основном просто проверяет базу данных (через Ajax), чтобы увидеть, существует ли уже комбинация модели и серийного номера.,JQuery и Ajax, кажется, ведут себя как ожидалось, но мое сообщение проверки появляется, как только моя функция проверки вызывается.

Вот мой jQuery:

$.validator.addMethod('newserialandmodel',
    function (value, element, parameters) {
        var modelNumber = $('#ProductInformation_ModelNumber').val();
        var serialNumber = value;

        var token = $('input[name=__RequestVerificationToken]').val();

        $.ajax({
            type: "POST",
            url: "/ajax/getmodelandserialexists/",
            data: ({ 
                    modelNumber: modelNumber, 
                    serialNumber: serialNumber, 
                    '__RequestVerificationToken': token 
                  }),
            cache: true,
            dataType: 'json',
            success: function (response) {
                if (response.exists) {
                    $.validator.messages.newserialandmodel = 
                        $.format($.validator.messages.newserialandmodel);
                }

                return !response.exists;
            }
        });

        return false;
    }
);

$.validator.unobtrusive.adapters.add(
    'newserialandmodel',
    function (options) {
        options.rules['newserialandmodel'] = options.params;

        if (options.message != null) {
            $.validator.messages.newserialandmodel = options.message;
        }
    }
);

Вот какая формаэлемент выглядит так:

<input type="text" value="" 
 name="ProductInformation.SerialNumber" id="ProductInformation_SerialNumber" 
 data-val-required="The Serial number field is required." 
 data-val-newserialandmodel="There is already a contract with the provided model and serial numbers." 
 data-val-length-max="30" 
 data-val-length="The 30 field requires no more than 30 characters." 
 data-val="true" class="input-validation-error">

Когда я перехожу, как только он попадает в первую строку проверки, сообщение уже отображается:

Уже есть контрактс предоставленными моделью и серийными номерами.

Кроме того, даже если функция возвращает true, сообщение остается.

Остальная часть функции / Ajax работает просто отлично, я простомогу понять, почему он показывает это сообщение немедленно, и почему оно остается там, когда я возвращаю true.

Есть идеи, что происходит?

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

Благодаря ответам Грега и Зеро, это заставило меня немного поиграть с возвращаемым значением.

Проблема в том, что return в моей функции успеха Ajax просто возвращает ответ обратно функции успеха, а не функции проверки. Поэтому мне пришлось изменить его, чтобы установить значение в функции успеха Ajax, и вернуть его.

Стоит также отметить, что мне пришлось включить async: false, так как в противном случае функция проверки вернется (значение по умолчанию false) до завершения вызова Ajax.

$.validator.addMethod('newserialandmodel',
    function (value, element, parameters) {
        var modelNumber = $('#ProductInformation_ModelNumber').val();
        var serialNumber = value;

        var token = $('input[name=__RequestVerificationToken]').val();

        var isValid = false;

        $.ajax({
            type: "POST",
            url: "/ajax/getmodelandserialexists/",
            data: ({ 
                    modelNumber: modelNumber, 
                    serialNumber: serialNumber, 
                    '__RequestVerificationToken': token }),
            async: false,
            dataType: 'json',
            success: function (response) {
                if (response.exists) {
                    $.validator.messages.newserialandmodel = 
                        $.format($.validator.messages.newserialandmodel);
                }

                isValid = !response.exists;
            }
        });

        return isValid;
    }
);
1 голос
/ 03 ноября 2011

Я думаю, это потому, что вы возвращаете false в конце своей функции. Таким образом, функция вернет false, и затем вызов success сработает, пытаясь вернуть true, но уже слишком поздно, и false уже возвращен в валидатор. Простым решением было бы сделать ваш AJAX-вызов синхронным, используя async: false.

0 голосов
/ 03 ноября 2011

Пара догадок:

  1. У вас есть «cache: true», что означает, что он не будет извлекаться с сервера, если URL-адрес совпадает. Я не знаю, проверяет ли кэширование параметры POSTed, поэтому возможно, что даже с другими параметрами он будет использовать кэшированную версию. Попробуйте установить кэш на false.

  2. Я не знаком с API адаптеров, но возможно ли, что предыдущее действие вызвало выполнение условия? (параметры на самом деле не равны нулю, когда это выполняется)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...