如何创建一个没有动作的路线?

时间:2012-11-28 21:54:34

标签: asp.net-mvc

是否可以在不采取行动的情况下创建路线?

我有这个默认路线:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

但我也想要这样的网址:http://mysite/bar/1234其中1234IDbar是控制器。

所以我创建了以下路线:

routes.MapRoute(
    name: "BarRoute",
    url: "{controller}/{id}",
    defaults: new { controller = "bar", action = "Index", id = UrlParameter.Optional }
);

但是当我导航到http://mysite/bar/1234时,它说没有找到资源。我在第二条路线上做错了什么?

2 个答案:

答案 0 :(得分:5)

routes.MapRoute(
  name:        "BarRoute",
  url:         "{controller}/{id}",
  defaults:    new { controller = "Bar", action = "Index" },
  constraints: new { id = @"\d+" }
);

您必须考虑到您的路线必须放在适当的位置 - 在更一般的路线之前,例如:

routes.MapRoute(
           name: "BarRoute",
routes.MapRoute(
           name: "Default",

答案 1 :(得分:3)

在没有任何约束的情况下,您不能拥有以下2条路线

  • {controller}/{action}/{id}
  • {controller}/{id}

这两条路线不相容。当您尝试访问http://mysite/bar/1234时,路由引擎正在分析您的路由,/bar/1234与您的第一条路由匹配。除了我猜你在1234控制器上没有名为Bar的动作。

因此,如果您希望此设置生效,则需要指定一些constraints。另外,请不要忘记路由定义的顺序很重要,因为它们是按照您定义的顺序解析的。因此,请确保在顶部放置更具体的路线。