Маршрут по умолчанию ASP.NET MVC?

Я создал новый проект ASP.NET MVC и реализовал фильтр авторизации сайта.

Когда я сопоставляю маршруты с парой {controller}/{action}, я передаю для маршрута значение по умолчанию role = "SomeRole".

Он отлично работает, если я просматриваю полный URL (http://localhost/somecontroller/someaction) и указываю полный маршрут

MapRoute("SomeAction", "somecontroller/someaction",
 new { controller = "SomeController", action = "SomeAction", role = "SomeRole");

Проблема в том, что когда кто-то посещает http://thesiteaddress.com, должен быть маршрут по умолчанию, который вызывает /home/index вместо /, и если я укажу

MapRoute("Default", new { controller="somecontroller",action="action" });

тогда я теряю role="SomeRole" из предыдущего MapRoute.

Как я могу это решить?


person Community    schedule 10.06.2009    source источник


Ответы (4)


Убедитесь, что маршрут Default находится в НИЖНЕЙ ЧАСТИ указанной таблицы маршрутов. Когда дело доходит до таблиц маршрутизации ASP.NET MVC, порядок имеет значение.

Правильный порядок - это ваш «наиболее конкретный» маршрут до наименее конкретного маршрута.

person George Stocker    schedule 10.06.2009
comment
Не могли бы вы процитировать ваш источник? - person Manuel Hernandez; 12.02.2014
comment
@manuelhe books.google.com/ - person George Stocker; 12.02.2014

Собственно, Джордж прав. MVC Routing соблюдает маршрут заказа. Ваш последний маршрут должен быть по возможности общим, а предыдущий - по возможности конкретным.

В вашем случае оба являются общими. Вам следует

MapRoute("SomeAction", "Post/{action}", new {controller = "Post", role = "User");

а потом

MapRoute("Default", new {controller="Home", action="Index", role = "Anonymous"});

Итак, вы придаете конкретность обоим маршрутам.

person Jirapong    schedule 24.06.2009
comment
В MVC4 декларатор маршрута по умолчанию перемещен из Global.asax в ~ / App_Start / RouteConfig.cs / RegisterRoutes () - person Andriy F.; 15.12.2012

Фил Хаак выпустил инструмент отладки маршрута, который может оказаться бесценным. в понимании подобных проблем.

С помощью этого инструмента вы можете увидеть, как ваше приложение MVC анализирует URL-адрес и сопоставляет его с вашим RouteTable.

person Ray Vernagus    schedule 10.06.2009

Если вы не указываете имя маршрута или действие определяется с помощью HTTP-запроса, оно будет выглядеть в порядке, в котором они были добавлены. Когда он в первый раз находит подходящий, он останавливается. Так что, вероятно, происходит совпадение предыдущего с тем, что вы добавили.

person Chad Moran    schedule 10.06.2009