如何在 ASP.NET MVC2 中使用下划线路由小写 URL('questions/add_to_favorites/123')?
Posted
技术标签:
【中文标题】如何在 ASP.NET MVC2 中使用下划线路由小写 URL(\'questions/add_to_favorites/123\')?【英文标题】:How to route lower-case URLs ('questions/add_to_favorites/123') with underscores in ASP.NET MVC2?如何在 ASP.NET MVC2 中使用下划线路由小写 URL('questions/add_to_favorites/123')? 【发布时间】:2011-03-09 09:50:40 【问题描述】:ASP.NET MVC 2 控制器和操作使用 UpperCamelCase。
由于某些原因,包括 SO 在内的许多大型网站在 url 中使用小写(带下划线)来表示控制器和操作。例子:
https://***.com/questions
https://***.com/users/377920/randomguy
http://www.reddit.com/ad_inq/
http://www.wired.com/special_multimedia/mobile/
etc.
我想知道这是如何实现的。
默认路由器似乎不区分大小写,即。 ***.com/questions/ask
将毫无问题地被定向到 Questions-controller 的 Ask() 方法。
但是,假设我们想将 questions/add_to_favorites
定向到 Questions-controller 的 AddToFavorites() 操作。
-
这是如何实现的?
现在是否需要使用
html.ActionLink("add_to_favorites")
而不是Html.ActionLink("AddToFavorites")
使HTML 中的链接指向questions/add_to_favorites
而不是Questions/AddToFavorites
?
编辑: 类似帖子
How can I have lowercase routes in ASP.NET MVC? ASP.NET MVC: Get lowercase links (instead of Camel Case)支持下划线的一种方法是使用 ActionName 属性:
[ActionName("add_to_favorites")]
public ActionResult AddToFavorites()
// ...
但是,这不适用于控制器。也许如果我们可以在请求到达路由机制之前以某种方式删除请求中的所有下划线,那么它会起作用。
【问题讨论】:
快速旁注。请确保add_to_favorite
需要 POST。 GET 请求永远不应该修改服务器上的状态
同意!这不仅适用于 RESTful 纯粹主义者:状态变化的 GET 请求会造成安全漏洞。虽然,如果你强制授权并防止跨站点请求伪造(使用 AntiForgeryToken),我不认为 GET'ing 从技术上讲是一个问题。
请注意,仅添加 [HttpPost] 并不能解决安全问题;坏人可以简单地模拟一个表单帖子。因此,即使您强制 POST(或 AJAX 中的 DELETE/PUT),您仍然要小心。
【参考方案1】:
您可以手动添加自定义路线。这不是一个通用的解决方案,必须为每个控制器和操作单独添加。
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
一样有效,因为默认路由机制不区分大小写。
【讨论】:
以上是关于如何在 ASP.NET MVC2 中使用下划线路由小写 URL('questions/add_to_favorites/123')?的主要内容,如果未能解决你的问题,请参考以下文章
asp.net mvc2.0中如何将datatable对象传到view的前台然后获取datatable中表字段得值?
在哪里可以找到在 ASP .NET MVC2 中实现密码恢复的 C# 示例代码