3

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

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

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将毫无问题地定向到 Questions-controller 的 Ask() 方法。

但是,假设我们想直接questions/add_to_favorites访问 Questions-controller 的 AddToFavorites() 操作。

  1. 这是如何实现的?
  2. 现在是否需要使用Html.ActionLink("add_to_favorites") 而不是Html.ActionLink("AddToFavorites")使HTML中的链接指向questions/add_to_favorites而不是Questions/AddToFavorites

编辑:类似的帖子

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

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

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

4

1 回答 1

2

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

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

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

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

请注意,由于默认路由机制不区分大小写,原来的仍然可以/Question/AddToFavorites正常工作。/qUeStIoN/aDdtOfAvOrItEs/qUeStIoNs-FOO/ADD_TO_FAVORITES

于 2010-06-30T00:41:55.320 回答