Вы используете смешанную маршрутизацию - у вас есть обычная маршрутизация для первого действия и атрибутная маршрутизация для второго.
Когда вы переходите к /1
, вы выполняете второе действие с параметром id
, поскольку он настроен на использование маршрутизации атрибута для пути /{id}
(с помощью [HttpGet("{id}")]
): переопределение атрибута переопределяет обычная маршрутизация.
Когда вы переходите к /Home/Index/1
, вы выполняете свое первое действие без параметра id
, просто потому, что другое имеющееся у вас действие больше не соответствует, если оно установлено виспользуйте атрибут маршрутизации (/{id}
), чтобы он больше не совпадал с /Home/Index/1
.С вашим обычным шаблоном маршрутизации от UseMvc
вы сказали, что id
является необязательным, и поэтому совпадение все еще действует.
Для достижения того, что вы ищете, вы можете использовать атрибутную маршрутизациюисключительно для этого контроллера.Вот как это будет выглядеть:
[Route("/")]
[Route("[controller]/[action]")]
public class HomeController : Controller
{
public IActionResult Index()
{
...
}
[HttpGet("{id}")]
public IActionResult Index(int id)
{
...
}
}
Добавление двух атрибутов [Route(...)]
добавляет поддержку следующих двух маршрутов:
/
и /{id}
. /Home/Index
и /Home/Index/{id}
.
[controller]
и [action]
- это заполнители, которые представляют имя контроллера и действие соответственно. Вы также можете просто использоватьбуквальные значения Home
и Index
, если вы предпочитаете что-то более фиксированное.
Вам не обязательно нужны оба [Route(...)]
атрибуты, но версия /
обеспечиваетКорень сайта также соответствует той же паре контроллер / действие.