Что означают фигурные скобки на маршруте в MVC? - PullRequest
3 голосов
/ 05 ноября 2011

Я настраиваю свои маршруты с проектом MVC, но я немного запутался в фигурных скобках ...

Если у меня есть ...

routes.MapRoute( "Music", "Music/{name}", new {  } );

Что такоеназначение фигурных скобок вокруг имени, это передается чему-то?Или это сопоставить с чем-то, если я передам объект по умолчанию в?

Ответы [ 3 ]

5 голосов
/ 05 ноября 2011

Это имена параметров, которые используются в запросах маршрутизации.Например, маршрут по умолчанию определяет три из них:

{controller}/{action}/{id}

controller и action параметры для поиска действия вашего контроллера.Параметр id может использоваться в качестве входных данных в этих действиях.

Когда вы определяете пользовательский маршрут, вы должны предоставить параметры controller и action.Если они не определены в вашем URL, вы должны предоставить значения по умолчанию, чтобы MVC знал, какое действие нужно выполнить, когда запрос соответствует этому маршруту.

  routes.MapRoute("Music",
                  "Music/{name}",
                   new { controller="Music", action="SomeAction" });

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

public ActionResult SomeAction(string name)
{
    //do something
}
2 голосов
/ 05 ноября 2011

В фигурных скобках указан тип именованного символа подстановки.

Маршрут "Music/Index" будет соответствовать только URL Music/Index и ничему другому

Маршрут "Music/{Name}" будет соответствовать любым URL-адресам, начинающимся с музыки и имеющим что-либо после косой черты. Он будет соответствовать как URL Music/metallica, так и Music/madonna.

.

С помощью фигурной скобки вы сможете выбрать "metallica" или "madonna" из указанных выше URL-адресов в качестве значений маршрута.

В качестве последнего примера: в ASP.NET MVC всегда есть стандартный маршрут. {controller}/{action}/{id}. Этот маршрут будет перехватывать URL-адреса, такие как Music/genre/rock или Product/edit/5. Результирующие значения маршрута для этих двух будут:

  • контроллер = музыка, экшн = жанр и id = рок для первого
  • controller = product, action = edit и id = 5 для последнего.
0 голосов
/ 05 ноября 2011

Я попытаюсь привести менее надуманный пример.

Маршруты в 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" }
);

Но там есть дублирование, которого не должно быть.

Маршруты тоже довольно сложные вещи, в этом порядке. Верхний маршрут будет оценен до нижнего. Если он соответствует структуре верхнего маршрута, он перейдет к этому действию, даже если это неправильное действие.

У Фила Хаака есть отладчик маршрута, который помогает с этим. И я также взял его исходный код и изменил его так, чтобы вы могли сделать его элементом управления и поместить его на все свои страницы как частичный (и, надеюсь, вы также добавите туда код, который позволил бы только внутренние люди, чтобы увидеть это).

...