Как я могу RedirectToAction в обратном вызове $ .ajax? - PullRequest
16 голосов
/ 21 августа 2010

Я использую $ .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", но это не рендеринг.

Ответы [ 4 ]

18 голосов
/ 21 августа 2010

Вам нужно использовать результат вашего ajax-запроса и использовать его для запуска javascript, чтобы вручную обновить window.location. Например, что-то вроде:

// Your ajax callback:
function(result) {
    if (result.redirectUrl != null) {
        window.location = result.redirectUrl;
    }
}

Где "результат" - это аргумент, передаваемый вам методом jjuery ajax после завершения запроса ajax. (И для генерации самого URL-адреса используйте UrlHelper.GenerateUrl, который является помощником MVC, который создает URL-адреса на основе действий / контроллеров / и т. Д.)

4 голосов
/ 10 марта 2016

Я знаю, что это супер старая статья, но после просмотра веб-страниц это все еще оставалось главным ответом в Google, и я решил использовать другое решение. Если вы хотите использовать чистый RedirectToAction, это также работает. Ответ RedirectToAction содержит полную разметку для представления.

C #:

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);
        }
    }
});
2 голосов
/ 20 декабря 2016

C # работал хорошо

Я просто изменил 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);
        }
    });   
0 голосов
/ 07 марта 2018

Вы можете использовать помощник Html.RenderAction в представлении:

public ActionResult IsReady(int id)
{
    if(true)
    {
        ViewBag.Action = "AnotherAction";
        return PartialView("_AjaxRedirect");
    }
    return Json("pending");
}

И в частичном представлении "_AjaxRedirect":

@{
    string action = ViewBag.ActionName;
    Html.RenderAction(action);
}

Ссылка: https://stackoverflow.com/a/49137153/150342

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