2016-01-12 6 views
0

У меня есть два маршрута в моем приложении, каждый в другом Controller, которые выглядят следующим образом:ASP.NET MVC маршрутизации конфликт

[Route("forgot-password", Order = 1)] 
[Route("{variable}", Order = 2)] 

При запуске приложения я получаю исключение:

Было найдено несколько типов контроллеров, соответствующих URL. Это может произойти, если маршруты атрибутов на нескольких контроллерах соответствуют запрошенному адресу .

Запомните эти действия различны Controllers. Атрибут Order, похоже, не работает через Controllers !.

Как я могу заставить этот сценарий работать в asp.net mvc routing? Я хочу использовать маршрутизацию, основанную на атрибутах, и я не хочу менять свои URL.

+0

Можно ли настроить второй маршрут, чтобы фактически включить токен? Например: [Маршрут ("some-action/{variable}")]? – Alexei

+1

Нет. Я хочу, чтобы мои URL-адреса были такими, какими я их хочу. – BowserKingKoopa

ответ

0

Объясняется механизм ошибки here (я полагаю, вы используете Web API). Короче говоря, приоритет соблюдается только внутри контроллера.

Кроме того, не ясно, для меня, почему вы хотите такой общий маршрут как:

[Route("{variable}")] 
+0

Я использую MVC, а не WebApi. Что делать, если у вас есть сайт, продающий автомобили? mywebsite.com/ford и mywebsite.com/toyota кажутся разумными URL-адресами. Я понимаю механизм ошибки, но я в полном недоумении, что маршрутизация asp.net не может справиться с этим сценарием. Другие библиотеки маршрутизации, основанные на атрибутах, просто позволяют указать параметр Order для разрешения конфликтов. – BowserKingKoopa

+0

@BowserKingKoopa - поддерживается этот сценарий. Атрибуты маршрута не являются наиболее гибким механизмом при использовании .NET Routing. Вместо этого вы можете [подклассы «RouteBase»] (http://stackoverflow.com/questions/31934144/multiple-levels-in-mvc-custom-routing/31958586#31958586) обрабатывать более сложные сценарии, такие как это. Вы можете даже маршрутизировать только на основе других частей контекста, а не только URL (например, cookie, session или form). Другой альтернативой (проще) было бы просто поместить ваши маршруты в файл 'RouteConfig.cs', используя« MapRoute ». – NightOwl888

+0

Это сложный сценарий? Каждая используемая мной библиотека маршрутизации, основанная на атрибутах, поддерживает это легко. – BowserKingKoopa

0

Проблема заключается в том, что все маршруты в приложении были сохранены вместе. Даже если он расположен в разных контроллерах, он является одним и тем же типом, поэтому они могут «видеть» друг друга. В вашем случае «забыли пароль» и «{variable}» имеют одинаковый формат, поэтому отображается ошибка о нескольких маршрутах. Как сказал @ NightOwl888, вы можете использовать RouteConfig для создания маршрутов, но в этом случае вам нужно изменить свои значения маршрутизации.

+0

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

Смежные вопросы