rkg*_*gos 5 asp.net-mvc routes url-routing asp.net-mvc-2
我们尝试在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" });
Run Code Online (Sandbox Code Playgroud)
编辑:
这是我们最新的代码:
routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}",
new { controller = "Customer", action = "Details" },
new { id = @"[\d]{1,6}" });
Run Code Online (Sandbox Code Playgroud)
有关从ASP.NET MVC 2 In Action(第234页)进行路由的章节讨论了尽可能避免使用数据库ID,但如果必须使用它们,请添加其他信息以使URL可读.这就是我们正在尝试(不成功)的事情.数据库ID目前的范围是1到6位(并且可能随着时间的推移而增长).
你在Darin的回答中来回让我相信你可能有另一条路线被匹配并用来代替这条路线:
routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}",
new { controller = "Customer", action = "Details" },
new { id = @"[\d]{1,6}" });
Run Code Online (Sandbox Code Playgroud)
切换路由添加到的顺序RouteCollection应解决问题.应该首先将更具体的路线添加到集合中.例如,如果你也有这条路线:
routes.MapRoute("person_login", "person/{id}",
new { controller = "Customer", action = "Details" });
Run Code Online (Sandbox Code Playgroud)
它应该出现在您更具体的"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" });
Run Code Online (Sandbox Code Playgroud)
您提供的URL 'http://example.com/Person/unnecessaryinfo-42'将与两个路由匹配,但由于您更具体的路线首先出现,因此将使用该路线.当映射不太具体的URL时,它将与第一个URL不匹配,因此将使用第二个路由.
那说确定URL匹配的路由可能有点棘手.值得庆幸的是,有两个很好的选项可以帮助进行路由调试:
斯蒂芬的解决方案可能是长期使用的最佳解决方案,但菲尔绝对更容易实现低调和脏调试.我将从重新排序您的路由开始,但如果这不能解决问题,请使用上述调试器之一.
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |