我将很快推出一个新网站。该网站的一部分包含产品。
我目前正在尝试在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链接”
答案 0 :(得分:4)
我会将我的网址设定为这些目标...
1)可用性。如果你能看出你在查看URL时会得到什么样的页面,那真是太好了。如果它足够短,可以输入和/或猜测,那就更好了。
2)搜索引擎。您确实希望将关键字放入这些网址中。我知道您想使用ID来查找产品,但是人类和搜索引擎希望在那里看到产品名称。此外,关键词越接近URL的开头,就越重视它。
这真的只是一个撇脂。如果您需要最佳网址,您需要确保类别和产品名称是唯一的,以便您可以查找它们而不是在地址中使用ID。
我建议的惯例是......
/产品/
/产品/服/
/产品/服/蓝绒面鞋/
答案 1 :(得分:1)
请注意,SO本身会在stackoverflow.com/questions/625213上列出此问题(后面的/忽略)。所以你至少有先例:)。
答案 2 :(得分:1)
我认为您制作的较短网址很好。 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之间的skus才能工作。显然,您希望使用正则表达式来适应您的特定场景,但这可以帮助您避免与操作冲突。在这种情况下,如果sku的值不在0-9之间,则路由引擎将转到下一个路由并尝试匹配。它会在找到匹配项之前执行此操作。
通过路由和约束的组合,您应该能够拥有对用户有意义的非常干净的URL。