Маршрутизация в приложении ASP.NET Core MVC

Что такое маршрутизация в ASP.NET Core MVC?

Маршрутизация в приложении ASP.NET Core MVC представляет собой механизм, в котором оно будет проверять входящие запросы (т.е. URL-адреса), а затем отправлять этот запрос на контроллеры и их методы действий. Это сопоставление выполняется правилами маршрутизации, которые определены для приложения. Мы можем сделать это, добавив промежуточное программное обеспечение маршрутизации в конвейер обработки запросов.

Таким образом, ASP.NET Core Framework отправляет входящие запросы, т.е. URL-адреса, на методы действия Controllers на основе маршрутов, настроенных в вашем приложении. Вы можете настроить несколько маршрутов для своего приложения и для каждого маршрута вы также можете установить некоторые конкретные конфигурации, такие как значения по умолчанию, ограничения, обработчики сообщений и т.д.

Какие типы маршрутизации поддерживаются ASP.NET Core MVC?

В приложении ASP.NET Core MVC вы можете определять маршруты двумя способами.

  1. Маршрутизация на основе соглашений,
  2. Маршрутизация на основе атрибутов.

Что такое маршрутизация на основе соглашений в приложении ASP.NET Core MVC?

В Conventional Based маршрутизации маршрут определяется на основе соглашений, определенных в шаблонах маршрутов, которые сопоставляют входящие запросы (т.е. URL-адреса) с контроллерами и методами их действий. В приложении ASP.NET Core MVC маршруты, основанные на соглашениях, определяются в методе Configure файла класса Startup.cs.

Что такое маршрутизация на основе атрибутов в приложении ASP.NET Core MVC?

В Attribute-Based маршрутизации маршрут определяется на основе атрибутов, которые настроены либо на уровне контроллера, либо на уровне метода действия. Мы можем использовать как обычную маршрутизацию, так и маршрутизацию на основе атрибутов в одном приложении.

Разбираем маршрутизацию на основе основе соглашений:

В приложении ASP.NET Core MVC это метод действия контроллера, который будет обрабатывать входящие запросы, т.е. URL-адреса. Например, если мы отправляем запрос к URL-адресу /Home/Index, то именно метод действия Index класса HomeController будет обрабатывать запрос, как показано в коде ниже.

// https://localhost:5000/Home/Indexs

public class HomeController : Controller
{
    public ViewResult Index()
    {
        return View();
    }
}

Аналогично, если вы отправляете запрос на URL-адрес /Home/Details/2, то метод действия Details класса HomeController, будет обрабатывать этот запрос, как показано в коде ниже. Здесь значение параметра 2 автоматически сопоставляется с параметром id метода действия Details.

// https://localhost:5000/Home/Details/2

public class HomeController : Controller
{
    public ViewResult Details(int id)
    {
        return View();
    }
}

Теперь возникает вопрос: как выполняется это сопоставление, т.е. как URL-адрес /Home/Index сопоставляется с методом действия Index и как URL-адрес /Home/Details/2 сопоставлен с методом действия Details класса HomeController, если в данной ситуации мы не определили явно какие-либо правила маршрутизации для приложения?

На самом деле это делается промежуточным ПО MVC, которое мы зарегистрировали в конвейере обработки запросов приложения.

Разбираем маршрутизацию по умолчанию в приложении ASP.NET Core MVC:

Мы можем добавить необходимое промежуточное программное обеспечение MVC в конвейер обработки запросов, вызвав метод UseMvcWithDefaultRoute() или вызвав метод UseMvc() внутри метода Configure() класса Startup.cs. Файл, как показано ниже. На данный момент мы используем промежуточное программное обеспечение UseMvcWithDefaultRoute().

public void Configure(IApplicationBuilder app, IHostingEnviroment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseMvcWithDefaultRoute(); // Промежуточное ПО MVC для смаршрутизации по умолчанию
}

Обратите внимание на реализацию метода UseMvcWithDefaultRoute() в aspnetcore v2.2

public static IApplicationBuilder UseMvcWithDefaultRoute(this IApplicationBuilder app)
{
    if(app == null)
    {
        throw new ArgumentNullException(nameoff(app));
    }
    // Тот самый маршрут по умолчанию
    return app.UseMvc(routes => {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Как вы можете видеть в приведенной выше реализации, этот метод вызывает метод UseMvc(), который добавляет маршрут по умолчанию в конвейер обработки запросов приложения. Маршрут по умолчанию создается с помощью следующего шаблона URL:

{controller=Home}/{action=Index}/{id?}

Подробнее о шаблонах маршрута в .NET Core MVC:

Приведенный выше шаблон маршрута по умолчанию отображает большинство URL-адресов, имеющих следующий шаблон.

http://localhost:5000/Student/Details/2

Путь первого сегмента URL, т.е. /Student, сопоставлен с StudentController. Как вы можете видеть в URL, у нас нет слова Controller с первым сегментом пути URL. Но он сопоставляется с StudentController, потому что когда ASP.NET Core MVC Framework находит слово /Student в качестве первого пути сегмента URL-адреса, тогда он ищет StudendController в директории с контроллерами.

Путь второго сегмента URL, то есть /Details, сопоставляется с методом действия Details (int id) класса HomeController, а путь третьего сегмента URL, то есть 2, сопоставляется с параметром id метода действия Details (int id).

Как вы можете видеть в шаблоне маршрута по умолчанию {controller=Home}/{action=Index}/{id?}, У нас есть вопросительный знак в конце параметра id, который делает параметр id необязательным. Это означает, что следующие два запроса теперь передаются на один и тот же метод действия Details класса HomeController.

/Home/Details/1
/Home/Details

В шаблоне маршрута по умолчанию {controller=Home}/{action=Index}/{id?} Значение Home в {controller=Home} является значением по умолчанию для контроллера. Точно так же значение Index в {action=Index} является значением по умолчанию для метода действия.

Это означает, что если мы перейдем к корневому URL-адресу приложения, как показано, то этот запрос будет обработан методом действия Index класса HomeController.

http://localhost:5000

Следующие два URL-адреса также булут сопоставлены с методом действия Index класса HomeController.

http://localhost:52190/Home
http://localhost:52190/Home/Index

Для большинства приложений ASP.NET Core MVC использование маршрута по умолчанию является подходящим решением. Например, создайте контроллер с именем StudentController, а затем скопируйте и вставьте в него следующий код.

using Microsoft.AspNetCore.Mvc;

namespace FirstCoreMVCApplication.Controllers
{
    public class StudentController : Controller
    {
        public string Index()
        {
            return "Index() Action Method of StudentController";
        }
        public string Details(string id)
        {
            return "Details() Action Method of StudentController";
        }
    }
}

Теперь URL-адрес /student/index сопоставлен с методом действия Index() класса StudentController, а URL-адрес /student/details сопоставлен с методом действия Details() в StudentController.