如果我有以下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}"
动作和ID相反,也许应该有默认动作。但MapRoute将如何知道应该像这样对待哪个控制器呢?
答案 0 :(得分: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]*" }
);
您需要确保路线名称与您设置的任何其他路线不同,并注意路线的顺序,因为其他相似的路线可以互相覆盖。在这种情况下,请确保您可能在默认路由之前想要这个,但请注意它将覆盖它。
对于没有控制器甚至动作,您可以设置默认值,并且在路线中不需要它们。
对于约束,您可以简单地将约束参数添加到路径以设置特定属性的正则表达式,如上所示。
编辑: 以下是一些有用的链接,可以在需要时提供有关路由的更多信息。
答案 1 :(得分:2)
您可以添加如下路线:
routes.MapRoute(
"CustomRoute",
"Home/{id}",
new { controller = "Home", action = "Index", id = "" });
确保将其放在默认路线上方。但是,此路由将阻止HomeController中的所有其他操作。由于我们没有对id参数的约束,因此框架无法知道您是在URL中引用操作还是id。由于此路线首先出现,因此会将其映射到id参数。