Как я могу перенаправитьToAction в обратный вызов $.ajax?
Я использую $.ajax() для опроса метода действия каждые 5 секунд следующим образом:
$.ajax({
type: 'GET', url: '/MyController/IsReady/1',
dataType: 'json', success: function (xhr_data) {
if (xhr_data.active == 'pending') {
setTimeout(function () { ajaxRequest(); }, 5000);
}
}
});
и действие ActionResult:
public ActionResult IsReady(int id)
{
if(true)
{
return RedirectToAction("AnotherAction");
}
return Json("pending");
}
Мне пришлось изменить тип возвращаемого действия на ActionResult, чтобы использовать RedirectToAction (первоначально это был JsonResult, и я возвращал Json(new { active = 'active' };
), но он имеет проблемы с перенаправлением и рендерингом нового представления из $.ajax(). Мне нужно перенаправить на "AnotherAction" из этого опроса ajax опроса. Ответ Firebug - это вид из "AnotherAction", но это не рендеринг.
Ответы
Ответ 1
Вам нужно использовать результат вашего запроса ajax и использовать его для запуска javascript для ручного обновления window.location. Например, что-то вроде:
// Your ajax callback:
function(result) {
if (result.redirectUrl != null) {
window.location = result.redirectUrl;
}
}
Где "результат" - это аргумент, переданный вам методом jQuery ajax после завершения запроса ajax. (И для создания самого URL-адреса используйте UrlHelper.GenerateUrl
, который является помощником MVC, который создает URL-адреса на основе действий/контроллеров и т.д.)
Ответ 2
Я знаю, что это супер-старая статья, но после чистки в Интернете это был главный ответ на Google, и я решил использовать другое решение. Если вы хотите использовать чистый RedirectToAction, это также работает. Ответ RedirectToAction содержит полную разметку для представления.
С#
return RedirectToAction("Action", "Controller", new { myRouteValue = foo});
JS:
$.ajax({
type: "POST",
url: "./PostController/PostAction",
data: data,
contentType: "application/json; charset=utf-8",
dataType: "json",
complete: function (result) {
if (result.responseText) {
$('body').html(result.responseText);
}
}
});
Ответ 3
С# хорошо работает
Я просто изменил JS, потому что responseText не работал у меня:
$.ajax({
type: "POST",
url: posturl,
contentType: false,
processData: false,
async: false,
data: requestjson,
success: function(result) {
if (result) {
$('body').html(result);
}
},
error: function (xhr, status, p3, p4){
var err = "Error " + " " + status + " " + p3 + " " + p4;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).Message;
console.log(err);
}
});