.net MVC JQuery проблема проверки на стороне клиента - PullRequest
1 голос
/ 25 июня 2011

Я использую .net 4 с MVC 2 и аннотации для проверки.Я создал собственный атрибут validationAttribute, чтобы проверить, существует ли электронное письмо в моей базе данных.Функция c # ismailexisting () возвращает правильное значение, но JavaScript не работает правильно.Javascript / jquery-часть выглядит так:

Sys.Mvc.ValidatorRegistry.validators["isexisting"] = function (rule) {
        return function (value, context) {
            $.ajax({
                url: "/persons/ismailexisting",
                type: "POST",
                data: { email: value },
                success: function (data) {
                    //alert("success: " + data);
                    if (data == "yes") {
                        return false;
                    }
                }
            })
            return true;
            return rule.ErrorMessage;
        };
    };

Если электронная почта уже существует, функция ismailexisting () возвращает «yes», в противном случае «no».Если электронное письмо существует (поэтому данные «да»), javascript должен препятствовать тому, чтобы пользователь продолжал, потому что он должен ввести другое электронное письмо.Если я раскомментирую alert (), значение данных будет правильным.Но что-то мешает javascript предоставить правильный результат на мой взгляд.

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

Заранее спасибо!

1 Ответ

0 голосов
/ 25 июня 2011

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

Sys.Mvc.ValidatorRegistry.validators["isexisting"] = function (rule) {
    return function (value, context) {
        var result = true;
        $.ajax({
            url: "/persons/ismailexisting",
            type: "POST",
            async: false, // force the call to run synchronously
            cache: false, // we probably don't want to use a cached result
            data: { email: value },
            success: function (data) {
                //alert("success: " + data);
                if (data == "yes") {
                    // set captured value for return
                    result = false;
                }
            }
        })
        return result;
        //return rule.ErrorMessage; // you'll never reach this...
    };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...