Asp.net mvc ASP.NET MVC偏离{controller}/{action}/{id}REST URL格式的陷阱?

Asp.net mvc ASP.NET MVC偏离{controller}/{action}/{id}REST URL格式的陷阱?,asp.net-mvc,rest,Asp.net Mvc,Rest,我将很快推出一个新网站。网站的一个部分包含产品 我目前正在尝试决定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

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

我目前正在尝试决定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"}
  );

或以下情况之一

 * call the action 'sku' , 'details' , 'item'
 * use an [ActionName] attribute and leave the action method name as 'ViewProduct'
我真的很喜欢
/products/1001
的简单性,这样用户就可以看到并更改它-但是如果我不小心,很快就会有与其他操作冲突的危险。我还必须确保在创建URL时使用
“product-route-short”
,这是一个非常小的麻烦

有人怎么想?您认为最佳实践是什么?这个例子很简单,但我当然希望整个网站保持一致,不想在谷歌为我索引所有内容后再对所有内容进行改造


如果有任何关于这个主题的特别好的播客或文章(一般或特定于ASP.NET),我将非常感谢它们的链接。我发现了一个很好的播客,其中有一件事他们特别提到,“这个播客不是关于如何创建好的REST链接的”

注意,所以它本身在stackoverflow.com/questions/625213上列出了这个问题(忽略了/aftern)。所以你至少有先例:)。

注意,So本身在stackoverflow.com/questions/625213上列出了这个问题(忽略了/aftern)。所以你至少有先例:)。

我认为你制作的网址越短越好。asp.net mvc路由引擎的优点在于,假设您在视图中创建了正确的链接,您可以在开发过程中更改路由。所以,在你走的时候,尽情玩玩吧

另一件需要记住的事情是MapRoute方法中的constraints参数。您可以尝试以下方式:

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。

我认为您制作的url越短越好。asp.net mvc路由引擎的优点在于,假设您在视图中创建了正确的链接,您可以在开发过程中更改路由。所以,在你走的时候,尽情玩玩吧

另一件需要记住的事情是MapRoute方法中的constraints参数。您可以尝试以下方式:

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。

我将使我的url朝向这些目标

1) 可用性。如果你能告诉我你会看到什么样的网页,这真是太好了。如果足够短,可以打字和/或猜测,那就更好了

2) 搜索引擎。你真的很想把你的关键词放到那些URL中。我知道你想用ID来查找产品,但是人类和搜索引擎想在那里看到产品名称。而且,关键字离URL的开头越近,它就越重要

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

我建议的惯例是

/产品/

/产品/服装/


/产品/服装/蓝色麂皮皮鞋/

我会让我的URL朝着这些目标前进

1) 可用性。如果你能告诉我你会看到什么样的网页,这真是太好了。如果足够短,可以打字和/或猜测,那就更好了

2) 搜索引擎。你真的很想把你的关键词放到那些URL中。我知道你想用ID来查找产品,但是人类和搜索引擎想在那里看到产品名称。而且,关键字离URL的开头越近,它就越重要

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

我建议的惯例是

/产品/

/产品/服装/


/产品/服装/蓝色绒面皮鞋/

我很喜欢这样一个事实,即在最终/之后的任何内容都会被忽略-这使得复制和通过URL变得很容易,并且仍然知道它们指的是什么。另外,你可以更改问题标题和现有链接不要断开。我很喜欢这样一个事实,即在final/之后的任何内容都会被忽略,这使得复制和过去的URL变得很容易,并且仍然知道它们指的是什么。您还可以更改问题标题,现有链接不会中断