Маршрут по умолчанию не работает с маршрутом области

Я создаю приложение в ASP.NET Core 2.2. В файле Startup.cs уже был маршрут по умолчанию, и я определил еще один маршрут для админки:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
    routes.MapRoute(
        name: "admin",
        template: "{area=Admin}/{controller=User}/{action=Index}/{id?}");
    });

Область администратора авторизована ролью Admin с использованием [Authorize(Roles = "Admin")]. Но когда я запускаю приложение, оно по умолчанию вызывает этот маршрут, хотя пользователь ничего не видит и получает неавторизованную страницу. Почему приложение использует маршрут области в качестве маршрута по умолчанию?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Говоря {area=Admin}, вы делаете часть area необязательной. Таким образом, маршрут, не содержащий области, также будет сопоставлен с ней (с выбранной областью Admin).

Если вы хотите убедиться, что только путь /Admin/ вызывает вашу область, вы можете сделать это следующим образом:

routes.MapRoute(
    name: "admin",
    template: "Admin/{controller=User}/{action=Index}/{id?}",
    defaults: new { area = "Admin" });

Вы также можете использовать этот метод быстрого доступа, который также устанавливает ограничение маршрута для вашей области:

routes.MapAreaRoute("admin", "Admin",
    "Admin/{controller=User}/{action=Index}/{id?}");

Кроме того, порядок, в котором вы регистрируете свои маршруты, также важен. Как правило, будет использоваться первый шаблон маршрута, соответствующий маршруту. Поэтому, поскольку ваш административный маршрут довольно специфичен, вам, вероятно, следует сначала указать его, а только затем вернуться к маршруту по умолчанию.

Как документация по областям маршрутизации в MVC объясняет:

Conventional routing is order-dependent. In general, routes with areas should be placed earlier in the route table as they’re more specific than routes without an area.

Другие вопросы по теме