花瓣括号在MVC中的路径中意味着什么?

时间:2011-11-05 12:42:17

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我正在设置一个MVC项目的路线,但我对花括号有点困惑......

如果我有......

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

围绕名称的花括号的目的是什么,这是否会传递给某些东西?或者,如果我在?

中传递默认对象,这会映射到某些内容吗?

3 个答案:

答案 0 :(得分:5)

它们是路由请求中使用的参数名称。例如,默认路由定义了其中三个:

{controller}/{action}/{id}

controlleraction参数用于查找控制器操作。 id参数可用作这些操作的输入。

定义自定义路线时,您必须提供controlleraction参数。如果它们未在您的URL中定义,则应提供默认值,以便MVC知道当请求与该路由匹配时要运行的操作。

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

您定义的其他参数(如idname)可用于为操作提供输入。在您的示例中,name参数将传递给匹配的操作,如下所示:

public ActionResult SomeAction(string name)
{
    //do something
}

答案 1 :(得分:2)

花括号表示一种命名的通配符。

"Music/Index"路由只会匹配网址Music/Index,而不会匹配

"Music/{Name}"路由将匹配以音乐开头的任何网址,并在斜线后面有任何内容。它会匹配网址Music/metallicaMusic/madonna

使用花括号,你可以从上面的URL中选择“metallica”或“madonna”作为路线值。

作为最后一个例子:使用ASP.NET MVC,始终存在标准路由。 {controller}/{action}/{id}。此路线将捕获Music/genre/rockProduct/edit/5等网址。 这两个的结果路由值将是:

  • controller = music,action = genre and id = rock for first one
  • controller = product,action = edit,id = 5表示最后一个。

答案 2 :(得分:0)

我会尝试提供一个不那么人为的例子。

ASP.NET MVC中的路由被放入字典中,当有传入请求时,MVC管道查看请求并尝试确定将其路由到的Controller和Action。

所以我想说我有以下控制器:HomeForumArticle

我们在谈论它的时候,假设我在ViewEdit上执行了以下操作:CreateForumArticle控制器。

这些括号允许我为两者创建一条路线:

routes.MapRoute("Viewing",
    {controller}/{action}/{id},
    new {controller = "Article", action="" },  //The article controller has precedence
    new { controller = "Article|Forum" } //contrived for this example
);

这些大括号意味着无论他们输入什么控制器(只要它是基于约束的ArticleForum),相同的路线就可以工作。这使我不必为论坛和文章控制器中的每个动作设置路径。

我可以轻松地制作两条路线:

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(并希望你也会在那里放置代码,只允许内部人员看到它)。