public class CarController : Controller
{
[Route("/[action]/[controller]/{id}")]
public IActionResult Delete(int id)
{
...
}
}
В маршрутах также можно жестко кодировать значения маршрутов вместо замены маркеров. Показанный ниже код даст тот же самый результат, как и предыдущий:
[Route("[controller]/[action]/{id?}")]
public class CarController : Controller
{
[Route("/Delete/Car/{id}")]
public IActionResult Delete(int id)
{
...
}
}
Именованные маршруты
Маршрутам можно также назначать имена, что обеспечит сокращение для перенаправления по определенному маршруту с указанием только его имени. Например, следующий атрибут маршрута имеет имя GetOrderDetails:
[HttpGet("{orderId}", Name = "GetOrderDetails")]
Маршрутизация и методы HTTP
Вы могли заметить, что ни в одном определении шаблона маршрута для методов не присутствует какой-нибудь метод HTTP. Причина в том, что механизм маршрутизации (в приложениях MVC и API) для выбора надлежащей конечной точки приложения использует шаблон маршрута и метод HTTP совместно.
Методы HTTP при маршрутизации в веб-приложениях (MVC)
Довольно часто при построении веб-приложений с применением паттерна MVC соответствовать определенному шаблону маршрута будут две конечные точки приложения. Средством различения в таких ситуациях является метод HTTP. Скажем, если CarController содержит два метода действий с именем Delete и они оба соответствуют шаблону маршрута, то выбор метода для выполнения основывается на методе HTTP, который используется в запросе. Первый метод Delete декорируется атрибутом HttpGet и будет выполняться, когда входящим запросом является GET. Второй метод Delete декорируется атрибутом HttpPost и будет выполняться, когда входящим запросом является POST:
[Route("[controller]/[action]/{id?}")]
public class CarController : Controller
{
[HttpGet]
public IActionResult Delete(int id)
{
...
}
[HttpPost]
public IActionResult Delete(int id, Car recordToDelete)
{
...
}
}
Маршруты можно модифицировать также с применением атрибутов методов HTTP, а не атрибута Route. Например, ниже показан необязательный маркер маршрута id, добавленный в шаблон маршрута для обоих методов Delete:
[Route("[controller]/[action] ")]
public class CarController : Controller
{
[HttpGet("{id?}")]
public IActionResult Delete(int? id)
{
...
}
[HttpPost("{id}")]
public IActionResult Delete(int id, Car recordToDelete)
{
...
}
}
Маршруты можно перезапускать с использованием методов HTTP; понадобится просто предварить шаблон маршрута символом прямой косой черты (/), как демонстрируется в следующем примере:
[HttpGet("/[controller]/[action]/{makeId}/{makeName}")]
public IActionResult ByMake(int makeId, string makeName)
{
ViewBag.MakeName = makeName;
return View(_repo.GetAllBy(makeId));
}
На заметку! Если метод действия не декорирован каким-либо атрибутом метода HTTP, то по умолчанию принимается метод GET. Тем не менее, в веб-приложениях MVC непомеченные методы действий могут также реагировать на запросы POST. По этой причине рекомендуется явно помечать все методы действий подходящим атрибутом метода HTTP.
Маршрутизация для служб API
Существенное различие между определениями маршрутов, которые применяются для приложений в стиле MVC, и определениями маршрутов, которые используются для служб REST, заключается в том, что в определениях маршрутов для служб не указываются методы действий. Методы действий выбираются на основе метода HTTP запроса (и необязательно типа содержимого), но не по имени. Ниже приведен код контроллера API с четырьмя методами, которые все соответствуют одному и тому же шаблону маршрута. Обратите внимание на атрибуты методов HTTP:
[Route("api/[controller]")]
[ApiController]
public class CarController : ControllerBase
{
[HttpGet("{id}")]
public IActionResult GetCarsById(int id)
{
...
}
[HttpPost]