如何在ASP.NET MVC2中使用下划线路由小写URL('questions / add_to_favorites / 123')?

时间:2010-06-29 01:17:35

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

ASP.NET MVC 2控制器和操作使用UpperCamelCase。

由于某些原因,许多大型网站(包括SO)在网址中使用小写字母(带下划线)作为控制器和操作。例子:

https://stackoverflow.com/questions
https://stackoverflow.com/users/377920/randomguy
http://www.reddit.com/ad_inq/
http://www.wired.com/special_multimedia/mobile/
etc.

我想知道这是如何实现的。

默认路由器似乎不区分大小写,即。 stackoverflow.com/questions/ask会毫无问题地转到问题控制器的Ask()方法。

但是,我们要将questions/add_to_favorites指向问题控制器的AddToFavorites()操作。

  1. 这是如何完成的?
  2. 现在是否需要使用Html.ActionLink("add_to_favorites") 而不是Html.ActionLink("AddToFavorites")而是将HTML点中的链接设为questions/add_to_favorites而不是Questions/AddToFavorites

  3. 编辑: 类似的帖子

    支持下划线的一种方法是使用ActionName属性:

    [ActionName("add_to_favorites")]
    public ActionResult AddToFavorites() {
      // ...
    }
    

    但是,这对控制器不起作用。也许如果我们能够在它到达路由机制之前以某种方式从请求中删除所有下划线,那么它就可以工作。

1 个答案:

答案 0 :(得分:2)

您可以手动添加自定义路线。这不是一个通用的解决方案,必须分别为每个控制器和操作添加。

routes.MapRoute(
    "Web2.0 RoR style lowercase URLs with underscores", 
    "questions-foo/add_to_favorites", 
    new { controller = "Questions", action = "AddToFavorites" }
);

很酷的是,生成Html辅助方法的URL不需要修改。路由表用于路由传入的请求以生成URL。所以,

Html.ActionLink("Add to favorites", "Questions", "AddToFavorites");映射到/questions-foo/add_to_favorites

请注意,原始/Question/AddToFavorites仍然与/qUeStIoN/aDdtOfAvOrItEs以及/qUeStIoNs-FOO/ADD_TO_FAVORITES一样,因为默认路由机制不区分大小写。

相关问题