Подтвердить что ты не робот

Как я могу перенаправить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", но это не рендеринг.

4b9b3361

Ответ 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);
        }
    });