ASP.NET MVC jQuery AJAX вызывает метод действия слишком поздно? - PullRequest
2 голосов
/ 21 марта 2009

У меня есть некоторый код jQuery во внешнем файле Javascript, который выполняет ajax-вызов метода действия, который есть в моем контроллере. Код во внешнем файле Javascript приведен ниже. Метод действия вызывается в конце концов, однако он вызывается не во времени. Когда я устанавливаю точку останова в методе действия, он не вызывается до тех пор, пока после нажатия кнопки подтверждения не будет возвращено значение false. Когда функция EmailExist возвращает «isvalid», isvalid не определен.

Таким образом, вопрос не в том, что метод действия вызывается в конце концов, он просто не вызывается по какой-либо причине, EmailExist всегда возвращает неопределенное значение, а метод действия MVC не вызывается, пока не будет возвращен щелчок кнопки. Есть мысли?

Метод действия:

        [AcceptVerbs(HttpVerbs.Post)]
    public JsonResult EmailExist(string email)
    {
        Account account = _generalService.GetAccountByEmail(email);

        bool exist = false;
        if (account != null)
            exist = true;

            return Json(new { indb = exist });
    }

Javascript:

$(document).ready(function() {
$("input[type=submit]").click(function() {

    var valid = true;

    // email - check required and valid

    var email = $("input[name='email']");
    var emailtrim = jQuery.trim(email.val());

    // email exists in db ajax request
    if (EmailExist(emailtrim)) {
        valid = false;
    }

    return valid;
})

function EmailExist(emailval) {

    var isvalid;

    // hit db
    $.ajax(
    {
    type: "POST",
    url: "/Account/EmailExist",
    data: { 'email': emailval },
    success: function(result) {

        if (result.indb) {
            isvalid = true;

        }
    },
    error: function(error) {
        alert(error);
    }
});

    return isvalid;
}

}); * +1011 *

1 Ответ

6 голосов
/ 21 марта 2009

Похоже, вы хотите, чтобы запрос был синхронным. Чтобы это произошло, вам нужно установить опцию async в запросе на false. По умолчанию запрос должен быть асинхронным, чтобы вы возвращались из вызова ajax до завершения запроса. В качестве альтернативы, вы можете переписать код так, чтобы обратный вызов успеха действительно выполнял свою работу. Последнее более идиоматично для AJAX - но иногда может быть более сложным.

$.ajax(
    {
    type: "POST",
    async: false,              // <- note addition
    url: "/Account/EmailExist",
    data: { 'email': emailval },
    success: function(result) {

        if (result.indb) {
            isvalid = true;

        }
    },
    error: function(error) {
        alert(error);
    }
});

OR

$("input[type=submit]").click(function() {

    // email - check required and valid

    var form = $(this).parent('form');
    var email = $("input[name='email']");
    var emailtrim = jQuery.trim(email.val());

    SubmitIfNoEmailExists(form,emailtrim);

    return false;
});

function SubmitIfNoEmailExists(form,emailval) {

    // hit db
    $.ajax({
        type: "POST",
        url: "/Account/EmailExist",
        data: { 'email': emailval },
        success: function(result) {
            if (!result.indb) {
               form.submit();
            }
        },
        error: function(error) {
            alert(error);
        }
    });
}

РЕДАКТИРОВАТЬ : Исходя из ваших комментариев, вы также можете использовать плагин проверки jQuery в качестве решения всех ваших задач проверки.

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