Переадресация

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 17.11.2019

В ASP.NET Core MVC для создания переадресации используются классы RedirectResult, LocalRedirectResult, RedirectToActionResult и RedirectToRouteResult. Но в зависимости от типа переадресации их применение будет отличаться.

Протокол HTTP поддерживает два типа переадресации:

  • постоянная переадресация. При постоянной переадресации сервер будет отправлять браузеру статусный код 301. При данном типе переадресации предполагается, что запрашиваемый документ окончательно перемещен в другое место. И после получения статусного кода 301 браузер может автоматически настраивать запросы на новый ресурс, даже если старый ресурс со временем перестанет применять переадресацию. Поэтому данный способ можно использовать, если вы полностью уверены, что документ на старое место уже не возвратится..

  • временная переадресация. При временной переадресации сервер будет отправлять браузеру статусный код 302. При этом считается, что запрашиваемый документ временно перемещен на другую страницу.

В обоих случаях для создания переадресации может использоваться объект RedirectResult, однако метод, возвращающий данный объект, будет отличаться.

Для временной переадресации применяется метод Redirect:

public IActionResult Index()
{
    return Redirect("~/Home/About");
}

В данном случае идет переадресация на локальный адрес - методу About контроллера Home. Причем обращаю внимание на знак тильды в начале пути "~". В ASP.NET данный знак ссылается на корень приложения. А использование пути без тильды "/Home/About" было бы не совсем корректно в некоторых слуаях. Например, при обращении к адресу Home/Index в данном случае будет идти переадресация на ресурс Home/Home/About. Поэтому рекомендую всегда использовать в начале локального адреса тильду.

Ну и кроме того, также можно обращаться к внешнему ресурсу: return Redirect("http://microsoft.com")

Для постоянной переадресации подобным образом используется метод RedirectPermanent. Принцип его применения тот же самый:

public IActionResult Index()
{
    return RedirectPermanent("~/Home/About");
}

Для обращения к локальным адресам в нашей системе мы можем использовать класс LocalRedirectResult. Для создания временной переадресации применяется метод LocalRedirect(), а для создания постоянной переадресации - метод LocalRedirectPermanent

Эти методы также принимают адрес ресурса:

public IActionResult Index()
{
    return LocalRedirect("~/Home/About");
}

Если же мы передадим в эти методы адрес внешнего ресурса, например:

public IActionResult Index()
{
    return LocalRedirect("http://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("Area", "Home", new { altitude = 10, height = 3 });
    }
		
    public IActionResult Area(int altitude, int height)
    {
        double area = altitude * height / 2;
        return Content($"Площадь треугольника с основанием {altitude} и высотой {height} равна {area}");
    }
}

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

И последний класс, который используется для создания переадресации - 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

Рассмотрим последний вариант:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return RedirectToRoute("default", new { controller = "Home", action = "Area", height = 2, altitude = 20});
    }
		
    public IActionResult Area(int altitude, int height)
    {
        double area = altitude * height / 2;
        return Content($"Площадь треугольника с основанием {altitude} и высотой {height} равна {area}");
    }
}

В классе Startup по умолчанию определен один маршрут:

app.UseEndpoints(endpoints =>
{
	endpoints.MapControllerRoute(
		name: "default",
		pattern: "{controller=Home}/{action=Index}/{id?}");
});

Поэтому в метод RedirectToRoute передается название "default". В этом маршруте есть параметры controller, action, которые устанавливаются в анонимном объекте. Ну и также передаются параметры altitude и height, которые принимает метод Area.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850