【问题标题】:Pitfalls of deviating from the {controller}/{action}/{id} REST URL format for ASP.NET MVC?偏离 ASP.NET MVC 的 {controller}/{action}/{id} REST URL 格式的陷阱?
【发布时间】:2009-03-09 06:32:31
【问题描述】:

我将很快推出一个新网站。该网站的一个部分包含产品。

我目前正在尝试为 ASP.NET 路由选择不同的 URL:

**产品:**

 /products/1001
 /products/sku/1001
 /products/product/1001
 /products/view/1001

**类别:**

 /products/category/cats
 /products/category/clothing

 /products/cats         - this is pretty nasty
 /products/clothing

我主要是想决定我应该采用以下哪一项。 我目前正在做第一个。

  routes.MapRoute(
    "product-route-short",
    "products/{sku}",
    new { controller = "Products", action = "ViewProduct", sku = "1001"}
  );

  routes.MapRoute(
    "product-route-short",
    "products/sku/{sku}",
    new { controller = "Products", action = "ViewProduct", sku = "1001"}
  );

或以下之一

 * call the action 'sku' , 'details' , 'item'
 * use an [ActionName] attribute and leave the action method name as 'ViewProduct'

我真的很喜欢/products/1001 的简单性,因此用户可以看到并更改它 - 但如果我不小心,它很快就会与其他操作发生冲突。我还必须确保在创建我的 URL 时使用 'product-route-short',这是一个非常小的痛苦。

有人怎么想?您发现最佳实践是什么?这个例子非常简单,但我当然希望在整个网站上保持一致,并且不想在 Google 已经为我索引所有内容后对所有内容进行改造。

如果有任何关于该主题(一般或特定于 ASP.NET)的特别好的播客或文章,我会很感激它们的链接。我找到了一个很好的播客,他们特别说的一件事是“这个播客不是关于如何创建良好的 REST 链接”

【问题讨论】:

    标签: asp.net-mvc rest


    【解决方案1】:

    我会根据这些目标调整我的网址...

    1) 可用性。如果您可以通过查看 URL 来判断您将获得什么样的页面,那真是太好了。如果它足够短,可以输入和/或猜测,那就更好了。

    2) 搜索引擎。您确实希望将关键字放入这些 URL。我知道您想使用 ID 来查找产品,但人类和搜索引擎希望在那里看到产品名称。此外,关键字越靠近 URL 的开头,它的重要性就越高。

    这实际上只是一个略读。如果您想要最好的 URL,您需要确保类别和产品名称是唯一的,这样您就可以查找它们,而不是在地址中使用 ID。

    我建议的约定是……

    /产品/

    /产品/服装/

    /products/clothing/blue-suede-shoes/

    【讨论】:

      【解决方案2】:

      请注意,SO 本身在 stackoverflow.com/questions/625213 上列出了此问题(之后的 / 被忽略)。所以你至少有先例:)。

      【讨论】:

      • 我喜欢这样一个事实,即最后 / 之后的任何内容都被忽略 - 这使得复制和过去 URL 并且仍然知道它们所指的内容很容易。您也可以更改问题标题并且现有链接不会中断
      【解决方案3】:

      我认为您制作的较短 URL 很好。 asp.net mvc 路由引擎的美妙之处在于,假设您在视图中正确创建了链接,您可以在开发时更改路由。因此,您可以随意玩耍。

      要记住的另一件事是 MapRoute 方法中的约束参数。你总是可以尝试这样的:

      routes.MapRoute( 
      "product-route-short", 
      "products/{sku}", 
      new { controller = "Products", action = "ViewProduct", sku = "1001" } , 
      new { sku = @"[0-9]" } 
      );
      
      routes.MapRoute( 
      "product-route-other", 
      "products/{action}/id", 
      new { controller = "Products", action = "ViewProduct" } 
      );
      

      该过滤器将使它起作用,因此只有 0-9 之间的 sku 可以工作。显然,您希望使用正则表达式来适应您的特定场景,但这将帮助您避免与操作发生冲突。在这种情况下,如果 sku 的值不在 0-9 之间,那么路由引擎将转到下一个路由并尝试匹配该路由。它会一直这样做,直到找到匹配项。

      结合路由和约束,您应该能够拥有对用户有意义的非常干净的 url。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        相关资源
        最近更新 更多