Я попытаюсь привести менее надуманный пример.
Маршруты в ASP.NET MVC помещаются в словарь, и при поступлении входящего запроса конвейер MVC просматривает запрос и пытается определить, к какому контроллеру и действию направить его.
Допустим, у меня есть следующие контроллеры: Home
, Forum
и Article
И пока мы это делаем, допустим, у меня есть следующие действия: View
, Edit
, Create
на обоих контроллерах Forum
и Article
.
Эти скобки позволяют мне создать один маршрут для обоих:
routes.MapRoute("Viewing",
{controller}/{action}/{id},
new {controller = "Article", action="" }, //The article controller has precedence
new { controller = "Article|Forum" } //contrived for this example
);
Эти фигурные скобки означают, что независимо от того, в какой контроллер они вставлены (при условии, что он Article
или Forum
основан на ограничениях), один и тот же маршрут работает. Это избавляет меня от необходимости иметь маршрут для каждого действия в форуме и контроллере статей.
Я мог бы так же легко сделать два маршрута:
routes.MapRoute("Articles",
article/{action}/{id},
new {controller = "Article" } //The article controller has precedence
);
routes.MapRoute("Forums",
forum/{action}/{id},
new { controller = "forum" }
);
Но там есть дублирование, которого не должно быть.
Маршруты тоже довольно сложные вещи, в этом порядке. Верхний маршрут будет оценен до нижнего. Если он соответствует структуре верхнего маршрута, он перейдет к этому действию, даже если это неправильное действие.
У Фила Хаака есть отладчик маршрута, который помогает с этим. И я также взял его исходный код и изменил его так, чтобы вы могли сделать его элементом управления и поместить его на все свои страницы как частичный (и, надеюсь, вы также добавите туда код, который позволил бы только внутренние люди, чтобы увидеть это).