如何从用户友好的URL中删除不必要的信息,然后才能进入控制器操作

时间:2010-10-21 18:22:46

标签: asp.net-mvc asp.net-mvc-2 routes url-routing

我们尝试在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位数(并且可能会随着时间的推移而增长)。

2 个答案:

答案 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路由令牌中添加一些正则表达式约束。