自定义MapRoute

时间:2012-05-23 15:53:53

标签: c# asp.net-mvc razor asp.net-mvc-routing maproute

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

我的最终目标是能够指定以下内容。我基本上用URL构造了“id”和“name”的值对。该名称无关紧要,仅供用户使用,我会在控制器中要求ID。

  

/仪表板/ 5-MY-村名/ 89-MY-亚群名称/ 133-也许偶数另一个子群

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

使用以下路线浏览“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来实现这些目标。

由于

1 个答案:

答案 0 :(得分: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}"