Как перенаправить на другой вид из блока catch, используя MVC

Я вызываю функцию из AJAX

$.ajax({
         type: "POST",
         url: "GetOneApple",
         data: {},
         dataType: "json",
         success: function (data) {}
});

Домашний контроллер:

[HttpPost]
public ActionResult GetOneApple()
{
     try
       {
      ..snip
       }
     catch (Exception e)
       {
           return RedirectToAction("ErrorPage", "Home");
       }
}

В блоке catch я также попробовал это:

return new RedirectToRouteResult(new RouteValueDictionary {
    { "Controller", "Home" }, 
    { "Action", "ErrorPage" }
});

У меня есть контроллер ErrorPage, как это

 public ActionResult ErrorPage()
        {
            return View();
        }

как я уже заметил,
если какая-либо ошибка произошла в блоке try, он должен перенаправить на ErrorPage, но страница не перенаправляет, используя firebug, я получил html "ErrorPage" в AjaxResponse от контроллера, даже если он не перенаправляет в представление "ErrorPage"

Что мне не хватает? Я новичок в этом, так что, надеюсь, есть простой ответ, который я не смог найти...

2 ответа

Решение

Вы смешиваете две концепции:

  1. REST-интерфейс используется AJAX-вызовом
  2. Веб-приложение, которое вы хотите перейти на страницу с ошибкой.

Ваш REST API должен всегда отвечать на запрос, никогда не просить клиента перенаправить. Вместо этого, в случае ошибки, верните подробности ошибки в формате JSON, например,

{ status: "error", message: "Error so and so" }

наряду с ошибкой HTTP-кода. Вы можете достичь этого следующим образом:

catch (Exception ex)
{
    Response.StatusCode = 500; // put a reasonable code here
    return Json(new { status = "error", message = ex.Message });
}

В вашем JavaScript, вы можете AJAX использовать обратный вызов ошибки, чтобы "поймать" это. Затем ваш JavaScript решает, что делать дальше. Если вы хотите отобразить ошибку для пользователя, вы можете использовать JavaScript для вывода сообщения в виде HTML.

(Примечание. Обычно вы перенаправляете свой браузер на страницу с ошибкой только в том случае, если запрос всей страницы недействителен. Если вы находитесь на допустимой странице и только один вызов AJAX не работает, вы не захотите выгружать действительную страницу и переходить к URL страницы ошибки (?). Даже если ваш браузер отправляет запрос страницы, который не выполняется, я обычно предпочитаю отображать ответ об ошибке с этого самого URL, а не перенаправлять браузер на "страницу ошибки". Причина в том, что перенаправление изменяет адрес в адресной строке и добавляет себя в историю. Например, если ваш пользователь хочет повторить попытку, нажав кнопку "обновить", браузер не будет повторять то же самое, что раньше приводило к ошибке. Вместо этого он просто перезагрузит страница ошибки, даже если теперь может работать оригинальный вариант использования.)

Не могли бы вы вернуть ошибку и обработать ошибку, как показано здесь (см. Второй из последнего примера на странице)? Затем вы бы перенаправили, используя что-то вроде этого.

Прямое RedirectToAction должно работать. Предполагая, что вы нацеливаетесь на правильный контроллер, возможно, вы могли бы попробовать установить флаг в перехвате попытки и перенаправить за пределы перехвата.

Я склонен не использовать RedirectToRouteResult, однако на вопрос о том, когда его использовать, здесь дан ответ.

Извините, это не ответ "сделай это, и все будет хорошо", но, надеюсь, он поможет тебе в правильном направлении.

Другие вопросы по тегам