Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Существует два вида переадресации: временная и постоянная. И в зависимости от вида переадресации при ее выполнении сервер посылает браузерам один из двух кодов HTTP:
статусный код 301 представляет постоянную переадресацию. При данном типе переадресации предполагается, что запрашиваемый документ окончательно перемещен в другое место. После получения данного статусного кода браузер может автоматически настраивать запросы на новый ресурс, даже если старый ресурс со временем перестанет применять переадресацию. Поэтому данный способ использовать нежелательно.
статусный код 302 представляет временную переадресацию. При временной переадресации считается, что запрашиваемый документ временно перемещен на другую страницу.
В обоих случаях для переадресации будет использоваться объект RedirectResult, однако метод, возвращающий данный объект, будет отличаться.
Для временной переадресации применяется метод Redirect:
public RedirectResult SomeMethod() { return Redirect("/Home/Index"); }
Для постоянной переадресации подобным образом используется метод RedirectPermanent:
public RedirectResult SomeMethod() { return RedirectPermanent("/Home/Index"); }
При этом нам необязательно возвращать из метода объект RedirectResult. Нередко возникает ситуация, когда в зависимости от некоторых условий требуется направить пользователя по одному адресу, либо переадресовать на другой ресурс. Типичная ситуация: авторизация пользователя - если он авторизован, то ему отображается требуемая веб-страница, а если нет, то он перенаправляется на страницу для логина. Например:
public ActionResult Buy(int id) { if (id > 3) { return Redirect("/Home/Index"); } ViewBag.BookId = id; return View(); }
Если в качестве параметра будет передано число больше 3, то произойдет редирект на Home/Index. В остальных случаях пользователю будет возвращаться представление.
Еще один класс для создания переадресации - RedirectToRouteResult - позволяет выполнить более детальную настройку перенаправлений. Он возвращается двумя методами: RedirectToAction и RedirectToRoute.
Метод RedirectToRoute позволяет произвести перенаправление по определенному маршруту внутри домена:
public RedirectToRouteResult SomeMethod() { return RedirectToRoute(new { controller="Home", action="Index"}); }
Метод RedirectToAction позволяет перейти к определенному действию определенного контроллера. Он также позволяет задать передаваемые параметры:
public RedirectToRouteResult SomeMethod() { return RedirectToAction("Square", "Home", new { a=10,h=12}); }
Методы Redirect/RedirectToAction
представлют временную переадресацию. Но они имеют свои двойники для создания постоянной
переадресации: RedirectPermanent/RedirectToActionPermanent
. Их действие аналогично, разница лишь в том, что они отправляют браузеру статусный код 301.
Однако методы RedirectPermanent и RedirectToActionPermanent не рекомендуется использовать,
а если и использовать, то с осторожностью. Так как неправильно настроенная постоянная переадресация может ухудшить позиции в поисковиках или
способствовать полному выпадению сайта из поиска.
Иногда возникает необходимость отправить сообщения об ошибках при доступе к тому или иному ресурсу. Обычно, если ресурс недоступен, mvc-фреймворк автоматически отреагирует на эту ситуацию, отправив соответствующий статусный код. Но в некоторых ситуациях нам нужно более тонко реагировать на полученный запрос. Например, у нас есть контент, к которому установлены возрастные ограничения. Мы смотрим введенный возраст, и если он попадает под ограничение, мы можем выслать статусный код ошибки:
public ActionResult Check(int age) { if (age < 21) { return new HttpStatusCodeResult(404); } return View(); }
Подобным образом мы можем послать браузеру любой другой статусный код.
В качестве альтернативы также можно возвращать объект HttpNotFoundResult с помощью метода HttpNotFound
public ActionResult Check(int age) { if (age < 21) { return HttpNotFound(); } return View(); }
И еще один класс, предназначенный для отправки статусных кодов - класс HttpUnauthorizedResult. Он извещает пользователя, что тот не имеет права доступа к ресурсу, отправляя браузеру статусный код 401:
public ActionResult Check(int age) { if (age < 21) { return new HttpUnauthorizedResult(); } return View(); }