【问题标题】: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://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() {
  // ...
}

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

【问题讨论】:

  • 快速旁注。请确保 add_to_favorite 需要 POST。 GET 请求永远不应该修改服务器上的状态
  • 同意!这不仅适用于 RESTful 纯粹主义者:状态变化的 GET 请求会造成安全漏洞。虽然,如果你强制授权并防止跨站点请求伪造(使用 AntiForgeryToken),我不认为 GET'ing 从技术上讲是一个问题。
  • 请注意,仅添加 [HttpPost] 并不能解决安全问题;坏人可以简单地模拟一个表单帖子。因此,即使您强制 POST(或 AJAX 中的 DELETE/PUT),您仍然要小心。

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


【解决方案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 一样有效,因为默认路由机制不区分大小写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多