我们尝试在ASP.NET MVC应用程序中使用自定义路由来生成此URL:'http://example.com/Person/unnecessaryinfo-42'
。 “unwantedinfo”是id的名称,它将使用户可以破解URL。以下是我们路线图的代码。这有效但我的控制器操作最终在id参数中以“unnecesaryinfo-42”结束。我可以在它到达控制器动作之前剥离“unwantedinfo-”吗?
routes.MapRoute("person_id", "person/{id}",
new { controller = "Customer", action = "Details" },
new { id = @"unnecessaryinfo-\d" });
编辑:
这是我们最新的代码:
routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}",
new { controller = "Customer", action = "Details" },
new { id = @"[\d]{1,6}" });
有关从ASP.NET MVC 2 In Action(第234页)进行路由的章节讨论了尽可能避免使用数据库ID,但如果必须使用它们,请添加其他信息以使URL可读。这就是我们正在尝试(不成功)的事情。数据库ID目前的范围是1到6位数(并且可能会随着时间的推移而增长)。
答案 0 :(得分:5)
你来回Darin's answer让我相信你可能有另一条路线被匹配并使用而不是这条路线:
routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}",
new { controller = "Customer", action = "Details" },
new { id = @"[\d]{1,6}" });
将路由添加到RouteCollection
的顺序切换应解决问题。应该首先将更具体的路线添加到集合中。例如,如果你也有这条路线:
routes.MapRoute("person_login", "person/{id}",
new { controller = "Customer", action = "Details" });
它应该出现在您更具体的“person_id”路线之后,因此您的代码将如下所示:
routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}",
new { controller = "Customer", action = "Details" },
new { id = @"[\d]{1,6}" });
routes.MapRoute("person_login", "person/{id}",
new { controller = "Customer", action = "Details" });
您提供的'http://example.com/Person/unnecessaryinfo-42'
的网址将与这两条路线匹配,但由于您的更具体的路线首先显示的是将要使用的路线。当映射不太具体的URL时,它将与第一个URL不匹配,因此将使用第二个路径。
那说确定URL匹配的路由可能有点棘手。值得庆幸的是,有两个很好的选项可以帮助进行路由调试:
斯蒂芬的解决方案可能是长期使用的最佳解决方案,但菲尔绝对更容易实现下调和脏调试。我首先重新排序您的路由,但如果这不能解决问题,请使用上述调试器之一。答案 1 :(得分:3)
routes.MapRoute(
"person_id",
"person/{unnecessaryinfo}-{id}",
new { controller = "Customer", action = "Details" },
new { id = @"\d" }
);
您还可以在unnecessaryinfo
路由令牌中添加一些正则表达式约束。