Контроллер действий завершается, но обратный вызов AJAX не вызывается? - PullRequest
0 голосов
/ 15 октября 2011

У меня есть скрипт, который создает объект JSON и отправляет его моему контроллеру действий.ActionController получает объект и знает, как связать его с моделью ViewModel.

Контроллер действий очень прост и выглядит следующим образом:

[HttpPost]
        public String SaveNumberMatrix(NumberViewModel model) {
            return "Finished";
        }

Функция AJAX:

function saveNumberMatrix(object, actioncontroller) {

    var finished = false;

    $.ajax({
    url: actioncontroller,
    type: 'POST',
    data: JSON.stringify(object),
    dataType: 'json',
    processData: false,
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        alert(data);
        finished = true;
        },   
    });
    alert(finished);
    return finished;
}

Я отладил контроллер действий, и предупреждения javascript закончились (false), прежде чем я войду в

"return "Finished";

Обратный вызов sucess никогда не вызывается Где я делаю это неправильно?

Ответы [ 4 ]

3 голосов
/ 15 октября 2011

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

При использовании AJAX не следует организовывать свой код JavaScript последовательно и синхронно.

Так и должно быть:

$.ajax({
    url: '/actioncontroller/savenumbermatrix',
    type: 'POST',
    data: JSON.stringify(object),
    dataType: 'json',
    processData: false,
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        // TODO: only here you can use the results of an AJAX call
    }
});

Также я бы порекомендовал вам, чтобы действия вашего контроллера всегда возвращали результаты действий, а не строки:

[HttpPost]
public ActionResult SaveNumberMatrix(NumberViewModel model) {
    return Json("Finished");
}

Другая проблема с вашим кодом заключается в том, что вы указываете dataType: 'json' в качестве ответа и возвращаете строку Finished с сервера, который является недопустимым JSON.

0 голосов
/ 14 мая 2014

Добавьте параметр async как false (async: false,), тогда метод AJAX будет вызываться синхронно.

0 голосов
/ 15 октября 2011

Похоже, ваш ajax-запрос не доходит до сервера. пожалуйста, используйте функцию ошибки ajax.

error: function(a,b,c){alert(a+b+c)}

и выясните проблему

0 голосов
/ 15 октября 2011

Вы не получаете обратный вызов, потому что не отправляете действительный json, вам нужно отправить json обратно, так как ваш dataType - json. Следовательно, это, вероятно, выдает ошибку.

Из документации jQuery:

dataTypeString
Default: Intelligent Guess (xml, json, script, or html)
The type of data that you're expecting back from the server. 

В вашем случае вы указываете json, но явно не отправляете обратно json

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