Маршрут не используется

#c# #asp.net-core #asp.net-core-mvc

#c# #asp.net-ядро #asp.net-core-mvc

Вопрос:

У меня есть контроллер, который имеет действие, которое выглядит следующим образом:

 public IActionResult Edit(long? page)
  

Я определил следующую маршрутизацию UseEndpoints в своем Startup классе

 endpoints.MapControllerRoute(
name: "Area",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{page?}");
  

Однако маршрут не подбирается и не сопоставляется с действием контроллера.
Когда я меняю маршрутизацию на эту

 endpoints.MapControllerRoute(
name: "Area",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
  

Маршрутизация работает, но, очевидно page , параметр метода есть null , потому что маршрутизация будет ожидать id параметра.

есть ли какой-либо особый случай для id параметра, который я пропустил, который мне нужно добавить, чтобы моя маршрутизация с page помощью параметра работала?

Ответ №1:

Существуют зарезервированные слова, которые нельзя использовать в качестве сегментов маршрута или имен параметров.

Использование page в качестве параметра маршрута является распространенной ошибкой.

Комментарии:

1. В этом-то и заключалась настоящая проблема. Поскольку мы внедрили Microsoft identity, нам понадобился конструктор MVC, и мы попытались добавить его через AddRazorPages() or AddMvc() . Раньше этого не было в нашей кодовой базе. Использование AddControllersWithViews() вместо этого устранило проблему и дало нам необходимые MvcBuilder для AddMicrosoftIdentityUI()

Ответ №2:

Разницы нет

  between pattern "{area:exists}/{controller=Home}/{action=Index}/{id?}"); and 
pattern: "{area:exists}/{controller=Home}/{action=Index}/{page?}");

  

поскольку ваш URL-адрес будет выглядеть как `…area / controller / edit / 12345
, и он будет работать так же

  for action public IActionResult Edit(long? page)  
and for public IActionResult Edit(int? id)
  

Но, как упоминалось @FeiHan, не используйте слово «страница» для маршрутизации, лучше оставьте просто «{area:exists} / {controller=Home} / {action=Index} / {id?}») или вы можете выбрать любое другое имя вместо «id».