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()操作。
Html.ActionLink("add_to_favorites")
而不是Html.ActionLink("AddToFavorites")
而是将HTML点中的链接设为questions/add_to_favorites
而不是Questions/AddToFavorites
?编辑: 类似的帖子
支持下划线的一种方法是使用ActionName属性:
[ActionName("add_to_favorites")]
public ActionResult AddToFavorites() {
// ...
}
但是,这对控制器不起作用。也许如果我们能够在它到达路由机制之前以某种方式从请求中删除所有下划线,那么它就可以工作。
答案 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
一样,因为默认路由机制不区分大小写。