ASP.NET MVC. Маршрутизация. Начало
Традиционно во многих веб-средах URL-адрес представлял собой физический файл на диске. Запрос к URL принимался веб-сервером, который выполнял некоторый код в этом файле для получения ответа. В MVC в большинстве случаев используется другой подход - отображение URL-адреса на вызов метода в классе.
Система маршрутизации работает с использованием множества маршрутов. Вместе маршруты образуют схему URL приложения, представляющую собой набор URL, которые приложение будет распознавать и реагировать на них. Каждый маршрут содержит шаблон URL, с которым сравниваются входящие URL. Если входящий URL соответствует шаблону, тогда он применяется системой маршрутизации для обработки этого URL. URL могут быть разбиты на сегменты - части URL кроме имени хоста и строки запроса, которые отделяются друг от друга символом
/. Например, http://mysite.com/Admin/Index содержит два сегмента Admin и Index.Подходы маршрутизации
Централизованный стиль определения маршрутов в одном месте называется традиционной маршрутизацией или маршрутизацией на основе соглашений. Начиная с MVC 5, есть другой вариант, использующий атрибуты контроллеров и методов действий, который называется маршрутизацией с помощью атрибутов.
При использовании маршрутизации с помощью атрибутов маршрут определяется отдельно для каждого контроллера или даже для каждого метода действия, с помощью атрибута Route.
[Route("home/[action]")]
public class HomeController : Controller {…}
Кроме того, с помощью атрибутов можно переименовывать действия в контроллере:[Route("[controller]/MyAction")]
public ViewResult Index() …
Тогда метод действия Index можно будет вызвать только по пути /<имя контроллера>/MyAction.К маршрутам, заданным в атрибутах, можно применить все те же расширения и ограничения, как и к традиционным. Они будут рассмотрены далее.
Традиционные маршруты определяются:
- в .Net Framework - в методе
RegisterRoutes файла App_Start/RouteConfig.cs:public static void RegisterRoutes(RouteCollection routes) {
routes.MapRoute("", "{controller}/{action}");
}
- в .Net Core - в методе Configure файла Startup.cs:public void Configure(IApplicationBuilder арр, IHostingEnvironment env) {
…
app.UseMvc(routes => { routes.MapRoute("", "{controller}/{action}");
}
Принцип определения маршрутов похож. Суть сводится к добавлению маршрута в коллекцию, для чего удобнее всего использовать метод MapRoute:routes.МapRoute(name: "default", template: "{controller}/{action}");
Использовать традиционные маршруты или атрибуты зависит от ваших предпочтений. Обычно традиционные маршруты используют для существующих приложений, когда хотят:- Иметь централизованную настройку всех маршрутов.
- Использовать пользовательские объекты ограничений.
Маршруты с использованием атрибутов имеет смысл использовать для новых приложений, если вы хотите хранить маршруты вместе с кодом методов действий.
Оба типа можно использовать совместно. На практике маршруты, заданные атрибутами, обычно более специфичны, поэтому в .Net Framework рекомендовано расположить вызов
routes.MapMvcAttributeRoutes(); перед определением традиционных маршрутов. В .Net Core этого делать не требуется, маршрут, определённый атрибутом, будет иметь приоритет перед стандартной конфигурацией. Продолжение следует…
Источники:
- Jon Galloway “Professional ASP.NET MVC 5”. – John Wiley & Sons Inc., 2014. Глава 9.
- Адам Фримен “Pro ASP.NET Core MVC 2”. – Диалектика, 2019. Глава 15.