Что такое маршрутизация в ASP.NET Core MVC?
Маршрутизация в приложении ASP.NET Core MVC представляет собой механизм, в котором оно будет проверять входящие запросы (т.е. URL-адреса), а затем отправлять этот запрос на контроллеры и их методы действий. Это сопоставление выполняется правилами маршрутизации, которые определены для приложения. Мы можем сделать это, добавив промежуточное программное обеспечение маршрутизации в конвейер обработки запросов.
Таким образом, ASP.NET Core Framework отправляет входящие запросы, т.е. URL-адреса, на методы действия Controllers
на основе маршрутов, настроенных в вашем приложении. Вы можете настроить несколько маршрутов для своего приложения и для каждого маршрута вы также можете установить некоторые конкретные конфигурации, такие как значения по умолчанию, ограничения, обработчики сообщений и т.д.
Какие типы маршрутизации поддерживаются ASP.NET Core MVC?
В приложении ASP.NET Core MVC вы можете определять маршруты двумя способами.
- Маршрутизация на основе соглашений,
- Маршрутизация на основе атрибутов.
Что такое маршрутизация на основе соглашений в приложении 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
.