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

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

В 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.

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