2

如果我有以下 MapRoute:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

我可以有一个像这样的网址:

blabla.com/Home/Index/123

但是我需要创建什么样的 MapRoute 才能做到这一点:

blabla.com/Home/123还是blabla.com/Home/DEADBEEF

我想它涉及到类似的东西 "{controller}/{id}/{action}"

action 和 id 颠倒过来,说不定应该有一个默认的 action。但是 MapRoute 怎么知道应该这样对待哪个控制器呢?

4

2 回答 2

3

你可能需要这些方面的东西。

  routes.MapRoute(
      name: "DefaultRoute",
      url: "Home/{action}",
      defaults: new { controller = "Home", action = "Index" },
      constraints: new { action = "[A-Za-z]*" }
  );

或不采取行动

  routes.MapRoute(
      name: "DefaultRoute",
      url: "Home/{id}",
      defaults: new { controller = "Home", action = "Index", id = "" },
      constraints: new { id = "[A-Za-z]*" }
  );

您需要确保路由名称与您设置的任何其他路由不同,并注意路由的顺序,因为其他类似的路由可以相互覆盖。在这种情况下,请确保您可能希望在默认路由之前使用它,但请注意它会覆盖它。

至于没有控制器甚至没有动作,您可以设置默认值并且在路由中不需要它们。

至于约束,您可以简单地将约束参数添加到路由中,为某个属性设置正则表达式,如上所示。

编辑:如果您需要,这里有一些有用的链接,可获取有关路由的更多信息。

于 2013-01-16T11:33:00.063 回答
2

您可以添加这样的路线:

routes.MapRoute(
    "CustomRoute",
    "Home/{id}",
    new { controller = "Home", action = "Index", id = "" });

确保将其放置在默认路由之上。然而,这条路线将阻止 HomeController 中的所有其他操作。由于我们对 id 参数没有限制,因此框架不可能知道您是指 URL 中的操作还是 id。由于此路由首先出现,因此会将其映射到 id 参数。

于 2013-01-16T11:47:52.633 回答