#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 будет вызываться синхронно.