我正在设置一个MVC项目的路线,但我对花括号有点困惑......
如果我有......
routes.MapRoute( "Music", "Music/{name}", new { } );
围绕名称的花括号的目的是什么,这是否会传递给某些东西?或者,如果我在?
中传递默认对象,这会映射到某些内容吗?答案 0 :(得分:5)
它们是路由请求中使用的参数名称。例如,默认路由定义了其中三个:
{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
}
答案 1 :(得分:2)
花括号表示一种命名的通配符。
"Music/Index"
路由只会匹配网址Music/Index
,而不会匹配
"Music/{Name}"
路由将匹配以音乐开头的任何网址,并在斜线后面有任何内容。它会匹配网址Music/metallica
和Music/madonna
。
使用花括号,你可以从上面的URL中选择“metallica”或“madonna”作为路线值。
作为最后一个例子:使用ASP.NET MVC,始终存在标准路由。 {controller}/{action}/{id}
。此路线将捕获Music/genre/rock
或Product/edit/5
等网址。
这两个的结果路由值将是:
答案 2 :(得分:0)
我会尝试提供一个不那么人为的例子。
ASP.NET MVC中的路由被放入字典中,当有传入请求时,MVC管道查看请求并尝试确定将其路由到的Controller和Action。
所以我想说我有以下控制器: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" }
);
但那里有重复,不需要在那里。
路线也很棘手,顺序很重要。顶部路线将在底部路线之前进行评估。如果它与顶部路线的结构匹配,它将转到该动作,即使这不是正确的动作。
Phil Haack有一个Route Debugger可以帮助解决这个问题。我还采用了他的源代码并对其进行了修改,以便你可以make it a control and put it on all your pages as a partial(并希望你也会在那里放置代码,只允许内部人员看到它)。