Контроллеры ASP.NET Core MVC. Переадресация

Для переадресации клиента в ASP.NET Core MVC предусмотрено достаточно большое количество методов, каждый из которых принимает различное количество параметров и возвращает определенные статусные коды HTTP. Разберемся с работой этими методами и объектами, которые выполняют переадресацию клиента.

Класс LocalRedirectResult

LocalRedirectResult осуществляет переадресацию на локальный адрес. Класс LocalRedirectResult возвращается рядом методов, содержащихся в классе Controller:

public virtual LocalRedirectResult LocalRedirect (string localUrl);
  • localUrl — локальный адрес на который необходимо произвести перенаправление
public virtual LocalRedirectResult LocalRedirectPermanent (string localUrl);
public virtual LocalRedirectResult LocalRedirectPermanentPreserveMethod (string localUrl);
public virtual LocalRedirectResult LocalRedirectPreserveMethod (string localUrl);

В зависимости от того, какой метод будет выбран, клиенту будет отправлен определенный код статуса (см. коды статуса в обзоре), например, LocalRedirect() вернет код статуса 302, а LocalRedirectPermanentPreserveMethod() — код статуса 308. При этом, все эти методы принимают в качестве параметра локальный адрес для перенаправления.

Например, создадим новое приложение ASP.NET Core MVC и определим в контроллере HomeController следующее действие:

public IActionResult RedirectToLocalAddress(string address)
{
    return LocalRedirect(address);
}

здесь переадресация происходит на адрес, указанный в строке запроса, например

https://localhost:7212/Home/RedirectToLocalAddress?address=~/home/privacy

в этом случае мы будем перенаправлены на страницу Privacy, которая имеется в шаблоне приложения ASP.NET Core MVC:

Если нам необходимо выполнить постоянную переадресацию клиента на новый адрес, то необходимо использовать методы LocalRedirectPermanent() или LocalRedirectPermanentPreserveMethod(), но, при этом стоит учитывать, что после такого перенаправления, чтобы корректно осуществлялась дальнейшая отладка приложения, необходимо будет периодически чистить кэш браузера.

Класс RedirectResult

Класс RedirectResult осуществляет переадресацию на внешний адрес и создается следующими методами класса Controller()

public virtual RedirectResult Redirect (string url);
  • url — адрес на который необходимо произвести перенаправление
public virtual RedirectResult RedirectPermanent (string url);
public virtual RedirectResult RedirectPermanentPreserveMethod (string url);
public virtual RedirectResult RedirectPreserveMethod (string url);

Например,

public IActionResult FindInGoogle(string search)
{
    return Redirect($"https://google.ru?q={search}");
}

таким образом, при переходе на адрес https://localhost:7212/Home/findingoogle?search=[строка] нас должно перенаправить на главную страницу Google с заданной строкой поиска. Например,

результат

Класс RedirectToRouteResult

Класс RedirectToRouteResult осуществляет перенаправление на указанный маршрут и создается следующими методами класса Controller:

public virtual RedirectToRouteResult RedirectToRoute (object? routeValues);
  • routeValues — параметры маршрута, используемые для формирования URL
  • routeName — название маршрута
  • fragment — фрагмент, который необходимо вставить в URL
public virtual RedirectToRouteResult RedirectToRoute (string? routeName);
public virtual RedirectToRouteResult RedirectToRoute (string? routeName, object? routeValues);
public virtual RedirectToRouteResult RedirectToRoute (string? routeName, string? fragment);
public virtual RedirectToRouteResult RedirectToRoutePermanent (string? routeName, object? routeValues, string? fragment);
public virtual RedirectToRouteResult RedirectToRoutePermanent (string? routeName, string? fragment);
public virtual RedirectToRouteResult RedirectToRoutePermanent (object? routeValues);
public virtual RedirectToRouteResult RedirectToRoutePermanent (string? routeName);
public virtual RedirectToRouteResult RedirectToRoutePermanentPreserveMethod (string? routeName = default, object? routeValues = default, string? fragment = default);
public virtual RedirectToRouteResult RedirectToRoutePreserveMethod (string? routeName = default, object? routeValues = default, string? fragment = default);

Чтобы продемонстрировать работу этих методов, создадим новый маршрут для нашего приложения. Для этого откроем класс Program приложения и добавим перед строками:

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

следующие строки:

//новый маршрут
app.MapControllerRoute(
   name: "blog",
   pattern: "blog/{controller=Home}/{action=BlogPage}/{id?}");

а также добавим новое действие в контроллер HomeController

public IActionResult BlogPage([FromRoute] string id) 
{
    return Content($"Страница блога {id}");
}

таким образом, если будет задан последний параметр маршрута, то в браузере мы будем видеть строку «Страница блога [id]» при переходе по адресу localhost:7212/blog/home/blogpage/. Например,

Теперь попробуем перенаправить на этот маршрут пользователя. Перепишем действие Index контроллера HomeController следующим образом:

public IActionResult Index()
{
    return RedirectToRoute("blog", new { action="BlogPage", id="25"});
}

здесь мы указали в первом параметре название маршрута, а во втором — объект, содержащий параметры маршрута — action и id. Если теперь запустить приложение, то мы сразу увидим результат перенаправления:

Если необходимо вставить в путь перенаправления фрагмент, то можно воспользоваться следующей версией метода:

public IActionResult Index()
{
    return RedirectToRoute("blog", new { action="BlogPage", id="25"}, "fragment");
}

В этом случае результат перенаправления будет следующий:

Класс RedirectToActionResult

Класс RedirectToActionResult осуществляет перенаправление клиента на заданное действие контроллера и создается следующими методами контроллера Controller:

public virtual RedirectToActionResult RedirectToAction ();
  • actionName — имя действия на которое необходимо перенаправить клиента
  • routeValues — параметры маршрута
  • controllerName — имя контроллера
  • fragment — фрагмент, который необходимо вставить в путь
public virtual RedirectToActionResult RedirectToAction (string? actionName);
public virtual RedirectToActionResult RedirectToAction (string? actionName, object? routeValues);
public virtual RedirectToActionResult RedirectToAction (string? actionName, string? controllerName);
public virtual RedirectToActionResult RedirectToAction (string? actionName, string? controllerName, object? routeValues);
public virtual RedirectToActionResult RedirectToAction (string? actionName, string? controllerName, string? fragment);
public virtual RedirectToActionResult RedirectToAction (string? actionName, string? controllerName, object? routeValues, string? fragment);

 

RedirectToActionPermanent() c параметрами, как у методов выше
public virtual RedirectToActionResult RedirectToActionPermanentPreserveMethod (string? actionName = default, string? controllerName = default, object? routeValues = default, string? fragment = default);
public virtual RedirectToActionResult RedirectToActionPreserveMethod (string? actionName = default, string? controllerName = default, object? routeValues = default, string? fragment = default);

Например, решим задачу по перенаправлению клиента на страницу блога (см. выше) с помощью одной из версий метода RedirectToAction():

public IActionResult Index()
{
    return RedirectToAction("BlogPage", new { id = 25 });
}

результат перенаправления:

Итого

В ASP.NET Core MVC перенаправление может происходить на локальный адрес, внешний адрес, определенный маршрут, определенное действие контроллера. При этом мы можем устанавливать временную или постоянную переадресацию.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии