我正在寻找一个快速的&使用描述性名称转换我的对象ID的优雅方式,以便我的自动生成的路由如下所示:
/products/oak-table-25x25-3-1
而不是
/products/5bd8c59c-fc37-40c3-bf79-dd30e79b55a5
在此示例中:
uid = "5bd8c59c-fc37-40c3-bf79-dd30e79b55a5"
name = "Oak table (25x25) 3/1"
我甚至不知道该功能如何命名,所以我可能会谷歌。
到目前为止,我看到的问题是“url-object-name”的唯一性,例如,如果我在db中有两个橡皮表25x35,并且它们的名称相差太小而不能唯一地命名,但足够愚弄数据库中的唯一约束。
我正在考虑在SQL中将名称转换的函数编写为UDF,然后添加一个返回它的计算字段,然后对该字段进行唯一约束。
是否有更主流的方式来实现这一目标?
答案 0 :(得分:1)
stackoverflow.com采用的一种方法是:
/产品/ 5bd8c59c-fc37-40c3-bf79-dd30e79b55a5 /橡木表25x25-3-1
这确保了唯一性,但是UUID的长度可能是一种威慑。除了uniqueidentifier字段之外,您可以考虑向products表添加顺序int或bigint标识值。然而,这将需要该列上的附加索引用于查找,尽管对于仅具有descritive字符串的Url将需要类似的索引。另一种方法是使用哈希值,例如按日期播种,您可以使用描述性名称进行组合。依赖数据库生成的顺序ID值更简单,但是如果您设想将来使用NoSQL存储机制,则可以考虑使用外部生成的哈希值进行追加。
答案 1 :(得分:1)
标识应具有2个属性:它应该是唯一的,不可加入。如果您可以保证,/products/oak-table-25x25-3-1
永远不会更改为/products/oak-table-25x25-3-1-1
(请记住,用户可以拥有不应返回404状态代码的书签) - 您可以使用name作为url参数并通过此参数获取记录。
如果您无法保证唯一性或想要更快地选择记录,请使用下一步:
/products/123/oak-table-25x25-3-1
- 按ID(123)/products/123/blablabla
- 应该重定向到第一个,因为blabla不存在或有其他身份/products/123
- 应该重定向到第一个并尝试使用更多简短的身份 - 请记住,在web 2.0网址是UI的一部分,UI应该是友好的。
答案 2 :(得分:0)
MVC路由(actions)将处理名称中的空格和斜杠。它将它们编码为%20,然后正确解码它们。
因此,您的网址为/products/oak%20table%2025x25-3%2F1
答案 3 :(得分:0)
我在我正在制作的电子商务平台上做了类似的事情。
我们的想法是,没有唯一ID的URL更适合SEO,但我们不希望唯一ID是可以经常更改的产品名称。
解决方案是实现.NET MVC“仅限URL slug”功能。产品经理为每个独特且分配给产品的产品创建“slu”。这些链接到产品,但产品ID和名称可以随时更改。
这允许:
domain.com/oak-table-25x25-3-1
指向:
/产品/ 5bd8c59c-fc37-40c3-bf79-dd30e79b55a5
(同样的功能也可用于类别,因此domain.com/tables可以指向domain.com/category/5b38c79c-f837-42c3-bh79-dd405479b15b5)
我已经记录了我是如何做到的: http://makit.net/post/3380143142/dotnet-slug-only-urls