Контроллер действий завершается, но обратный вызов AJAX не вызывается?

#javascript #jquery #asp.net-mvc-3 #asp.net-mvc-2

#javascript #jquery #asp.net-mvc-3 #asp.net-mvc-2

Вопрос:

У меня есть скрипт, который создает объект 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";
  

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

Ответ №1:

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

При использовании 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.

Комментарии:

1. Да, но почему я никогда не достигаю успешного обратного вызова?

2. @Kenci, о, это совершенно другой вопрос. Причин может быть много. Например, URL-адрес, который вы запрашиваете, неверен, и вы получаете 404. Или, может быть, внутри этого действия генерируется исключение, и вы получаете 500. Используйте FireBug, чтобы точно увидеть, что происходит под прикрытием. FireBug покажет вам точный запрос, отправленный на сервер, а также ответ от сервера, чтобы вы знали, что вы сделали неправильно. Также я бы порекомендовал вам, чтобы ваши действия контроллера возвращали ActionResult, а не string .

Ответ №2:

Вы не переходите к успешному обратному вызову, потому что вы не отправляете действительный json обратно, вам нужно отправить json обратно, поскольку ваш тип данных — 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

Комментарии:

1. вы можете использовать: return Json (строковый объект)

Ответ №3:

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

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

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

Ответ №4:

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