Маршруты можно модифицировать также с применением атрибутов методов 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]
public IActionResult CreateANewCar(Car entity)
{
...
}
[HttpPut("{id}")]
public IActionResult UpdateAnExistingCar(int id, Car entity)
{
...
}
[HttpDelete("{id}")]
public IActionResult DeleteACar(int id, Car entity)
{
...
}
}
Если метод действия не имеет атрибута метода HTTP, то он трактуется как конечная точка приложения для запросов GET
На заметку!
Инфраструктура ASP.NET Web API позволяет не указывать метод HTTP для метода действия, если его имя начинается сGet, Put, Delete или Post. Следование такому соглашению обычно считалось плохой идеей и в ASP.NET Core оно было удалено. Если для метода действия не указан метод HTTP, то он будет вызываться с применением НТТР-метода GET.Последним селектором конечных точек для контроллеров API является необязательный атрибут Consumes
content-type, иначе будет возвращена ошибка 415 Unsupported Media Туре (неподдерживаемый тип носителя). Следующие два примера конечных точек внутри одного и того же контроллера проводят различие между JSON и XML:[HttpPost]
[Consumes("application/json")]
public IActionResult PostJson(IEnumerable
Ok(new { Consumes = "application/json", Values = values });
[HttpPost]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult PostForm([FromForm] IEnumerable
Ok(new { Consumes = "application/x-www-form-urlencoded", Values = values });
Перенаправление с использованием маршрутизации