Если атрибут не применен, FooBarController использует обычную маршрутизацию, которая, вероятно, уже используется по умолчанию.Обычно он имеет индекс в качестве действия по умолчанию и позволяет также указать имя действия, поэтому все работает.
Когда вы применяете атрибут, все действия в этом контроллере теперь используют маршрутизацию атрибута.Эти два типа маршрутизации не объединены, вы можете использовать только один или другой.Обратите внимание, что
"При маршрутизации атрибута имя контроллера и имена действий не играют роли, в которой выбирается действие."
( источник документов ),Таким образом, эти два действия становятся одинаковыми, их имена игнорируются, и невозможно определить, какое из них использовать.Поэтому вам нужно помочь:
[Route("Foo/Bar")]
public class FooBarController : ControllerBase
{
[Route("")] // To make it default for "Foo/Bar"
[Route("Index")] // Combines to define the route template "Foo/Bar/Index"
public IActionResult Index()
{
// ...
}
[Route("SomeAction")] // Combines to define the route template "Foo/Bar/SomeAction"
public IActionResult SomeAction()
{
// ...
}
}
Да, это более многословно.Из того же источника:
Для маршрутизации атрибутов требуется больше ввода для указания маршрута;стандартный маршрут по умолчанию обрабатывает маршруты более кратко.Однако маршрутизация атрибутов позволяет (и требует) точного контроля того, какие шаблоны маршрутов применяются к каждому действию.