8

我正在尝试创建一些自定义地图路线,但无法使其正常工作。

我的最终目标是能够指定如下内容。在哪里,我基本上用“id”和“name”的值对构造了我的 URL。该名称无关紧要,仅用于取悦用户,尽管我需要控制器中的 ID。

/dashboards/5-My-Estate-name/89-My-subgroup-name/133-Maybe-even-another-subgroup

对于初学者,我正在研究第一部分并且遇到了麻烦。

在使用以下路由时浏览到“http://localhost:53933/dashboards/109-building-xyz”会产生错误A public action method '109-building-xyz' was not found on controller 'MyInterfaceInterface.Controllers.DashboardsController'.

routes.MapRoute(
  "Dashboard",
  "dashboards/{id}-{name}", // URL pattern
   new { controller = "Dashboards", action = "Index" },
   new { id = @"\d+", name = UrlParameter.Optional }
);

显然,我希望将其路由到带有参数的 Index 函数。

我究竟做错了什么?我是否正确地构建了这个?我来自 web-PHP 背景并使用 htaccess 来实现这样的事情。

谢谢

4

1 回答 1

9

路线的顺序很重要。MVC 将使用与 URL 模式匹配的模式匹配第一个声明的路由。

所以如果你有这个:

routes.MapRoute(
  "Default",
  "{controller}/{action}/{id}", // URL pattern
   new { controller = "Home", action = "Index" },
   new { id = UrlParameter.Optional }
);
routes.MapRoute(
  "Dashboard",
  "dashboards/{id}-{name}", // URL pattern
   new { controller = "Dashboards", action = "Index" },
   new { id = @"\d+", name = UrlParameter.Optional }
);

然后 URL 会发生什么http://localhost:53933/dashboards/109-building-xyz,MVC 会将“仪表板”匹配到控制器,将“109-building-xyz”匹配到操作。

您需要始终先声明最具体的路线,然后再声明更一般的路线,如下所示:

routes.MapRoute(
  "Dashboard",
  "dashboards/{id}-{name}", // URL pattern
   new { controller = "Dashboards", action = "Index" },
   new { id = @"\d+", name = UrlParameter.Optional }
);
routes.MapRoute(
  "Default",
  "{controller}/{action}/{id}", // URL pattern
   new { controller = "Home", action = "Index" },
   new { id = UrlParameter.Optional }
);

然而,Morten Mertner 在他的评论中是正确的——我认为你不能有 2 个不被正斜杠分隔的路由参数。您需要将您的 URL 模式更改为类似这样,以便将其与默认路由引擎一起使用:

"dashboards/{id}/{name}"
于 2012-05-23T16:10:13.903 回答