【问题标题】:What do the curly braces mean in a route in MVC?MVC 路由中的大括号是什么意思?
【发布时间】:2011-11-05 12:42:17
【问题描述】:

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

如果我有...

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

名称周围的花括号的目的是什么,这会传递给某些东西吗?或者如果我传入一个默认对象,这是否会映射到某些东西?

【问题讨论】:

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


【解决方案1】:

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

{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
}

【讨论】:

  • 是的,但为什么要添加花括号?为什么不直接添加音乐/索引?
  • 花括号表示它是一个变量。如果它不在大括号中,则表示静态文本。您可能希望在 URL 中定义常量部分。并非所有事物都必须是变量。
【解决方案2】:

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

"Music/Index" 路由只会匹配 URL Music/Index 而不会匹配其他任何东西

"Music/{Name}" 路由将匹配任何以 Music 开头并在斜杠后有任何内容的 URL。它将匹配 URL Music/metallicaMusic/madonna

使用大括号,您将能够从上述 URL 中选取“metallica”或“madonna”作为路由值。

作为最后一个示例:使用 ASP.NET MVC,总是有一个标准路径。 {controller}/{action}/{id}。此路由将捕获像 Music/genre/rockProduct/edit/5 这样的 URL。 这两个的结果路由值将是:

  • controller=music、action=genre 和 id=rock 用于第一个
  • controller=product、action=edit 和 id=5 用于最后一个。

【讨论】:

    【解决方案3】:

    我会尽量提供一个不那么做作的例子。

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

    假设我有以下控制器:HomeForumArticle

    当我们这样做的时候,假设我有以下操作:ForumArticle 控制器上的ViewEditCreate

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-28
      • 2011-01-07
      • 1970-01-01
      • 2022-11-30
      • 2019-06-16
      • 2013-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多