В ASP.NET Core MVC для выполнения переадресации применяются классы RedirectResult, LocalRedirectResult, RedirectToActionResult и RedirectToRouteResult. Но в зависимости от типа переадресации их применение будет отличаться.
Протокол HTTP поддерживает два типа переадресации:
постоянная переадресация. При постоянной переадресации сервер будет отправлять браузеру статусный код 301. При данном типе переадресации предполагается, что запрашиваемый документ окончательно перемещен в другое место. И после получения статусного кода 301 браузер может автоматически настраивать запросы на новый ресурс, даже если старый ресурс со временем перестанет применять переадресацию. Поэтому данный способ можно использовать, если вы полностью уверены, что документ на старое место уже не возвратится..
временная переадресация. При временной переадресации сервер будет отправлять браузеру статусный код 302. При этом считается, что запрашиваемый документ временно перемещен на другую страницу.
В обоих случаях для создания переадресации может использоваться объект RedirectResult, однако метод, возвращающий данный объект, будет отличаться.
Для временной переадресации применяется метод Redirect:
public class HomeController : Controller { public IActionResult Index() => Content("Index"); public IActionResult About() => Content("About"); public IActionResult Contact() { return Redirect("~/Home/About"); } }
В данном случае идет переадресация на локальный адрес - методу About контроллера Home.
Ну и кроме того, также можно обращаться к внешнему ресурсу:
public IActionResult Contact() { return Redirect("https://microsoft.com"); }
Для постоянной переадресации подобным образом используется метод RedirectPermanent. Принцип его применения тот же самый:
public IActionResult Contact() { return RedirectPermanent("~/Home/About"); }
Для обращения к локальным адресам в нашей системе мы можем использовать класс LocalRedirectResult. Для создания временной переадресации применяется метод LocalRedirect(), а для создания постоянной переадресации - метод LocalRedirectPermanent
Эти методы также принимают адрес ресурса:
public IActionResult Index() { return LocalRedirect("~/Home/About"); }
Если же мы передадим в эти методы адрес внешнего ресурса, например:
public IActionResult Index() { return LocalRedirect("https://microsoft.com"); }
То в этом случае метод выбросит исключение.
Для создания переадресации на определенный метод контроллера используется объект RedirectToActionResult. Опять же для его генерации используется пара методов для временной и постоянной переадресации: RedirectToAction и RedirectToActionPermanent
Оба этих метода имеют несколько версий:
RedirectToAction(string actionName)
/RedirectToActionPermanent(string actionName)
: actionName - метод в рамках текущего контроллера, на который надо выполнить переадресацию
RedirectToAction(string actionName, string controllerName)
/RedirectToActionPermanent(string actionName, string controllerName)
:
переадресация выполняется на метод actionName контроллера controllerName
RedirectToAction(string actionName, object routeValues)
/
RedirectToActionPermanent(string actionName, object routeValues)
: здесь также учитываются дополнительные параметры запроса, которые представляет объект routeValues
RedirectToAction(string actionName, string controllerName, object routeValues)
/
RedirectToActionPermanent(string actionName, string controllerName, object routeValues)
: объединение двух предыдущих версий
Рассмотрим на примере метода RedirectToAction()
:
public class HomeController : Controller { public IActionResult Index() { return RedirectToAction("About", "Home"); } public IActionResult About() => Content("About"); }
Здесь метод Index выполняет переадресацию на метод About контроллера Home.
Теперь передадим при переадресации некоторые значения:
public class HomeController : Controller { public IActionResult Index() { return RedirectToAction("About", "Home", new { name = "Tom", age = 37 }); } public IActionResult About(string name, int age) => Content($"Name:{name} Age: {age}"); }
В качестве последнего параметра в метод RedirectToAction
передается анонимный объект, каждое свойство которого имеет то же имя, что и параметры метода
About. В прицнипе тут можно было бы не использовать название контроллера, так как Index и About находятся в одном контроллере. В итоге при выполнении вызова
return RedirectToAction("About", "Home", new { name = "Tom", age = 37 });
будет происходить переадресация по адресу
https://localhost:7288/Home/About?name=Tom&age=37
И последний класс, который используется для создания переадресации - RedirectToRouteResult. Для переадресации он использует маршруты. Для создания объекта этого класса имеются два метода: RedirectToRoute и RedirectToRoutePermanent (соответственно для временной и постоянной переадресации).
Эти методы имеют по три перегруженных версии:
RedirectToRoute(string routeName)
/RedirectToRoutePermanent(string routeName)
: routeName - название маршрута
RedirectToRoute(object routeValues)
/RedirectToRoutePermanent(object routeValues)
: routeValues - параметры маршрута
RedirectToRoute(string routeName, object routeValues)
/
RedirectToRoutePermanent(string routeName, object routeValues)
: передает маршруту routeName параметры в виде объекта routeValues
Более подробно система маршрутизации будет рассмотрена далее. Сейчас же лишь вкратце коснемся темы, как выполнять переадресацию на маршрут. Прежде всего обратимся к файлу Program.cs:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); // добавляем поддержку контроллеров var app = builder.Build(); // устанавливаем сопоставление маршрутов с контроллерами app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
В методе app.MapControllerRoute
задается один маршрут, который имеет имя "default". Используя это имя, мы можем выполнить переадресацию на этот маршрут. Например:
public class HomeController : Controller { public IActionResult Index() { return RedirectToRoute("default", new { controller = "Home", action = "About", name = "Tom", age = 22 }); } public IActionResult About(string name, int age) => Content($"Name:{name} Age: {age}"); }
Здесь в метод RedirectToRoute передается название маршрута - "default". В этом маршруте есть параметры controller, action, которые устанавливаются в анонимном объекте. Ну и также передаются параметры name и age, которые принимает метод About.