MVC3路由 - 用对象名称替换id

时间:2011-06-03 23:18:46

标签: asp.net asp.net-mvc asp.net-mvc-3

我正在寻找一个快速的&使用描述性名称转换我的对象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,然后添加一个返回它的计算字段,然后对该字段进行唯一约束。

是否有更主流的方式来实现这一目标?

4 个答案:

答案 0 :(得分:1)

标识应具有2个属性:它应该是唯一的,不可加入。如果您可以保证,/products/oak-table-25x25-3-1永远不会更改为/products/oak-table-25x25-3-1-1(请记住,用户可以拥有不应返回404状态代码的书签) - 您可以使用name作为url参数并通过此参数获取记录。

如果您无法保证唯一性或想要更快地选择记录,请使用下一步:

  1. /products/123/oak-table-25x25-3-1 - 按ID(123)
  2. 获取记录
  3. /products/123/blablabla - 应该重定向到第一个,因为blabla不存在或有其他身份
  4. /products/123 - 应该重定向到第一个
  5. 并尝试使用更多简短的身份 - 请记住,在web 2.0网址是UI的一部分,UI应该是友好的。

答案 1 :(得分:1)

stackoverflow.com采用的一种方法是:

/产品/ 5bd8c59c-fc37-40c3-bf79-dd30e79b55a5 /橡木表25x25-3-1

这确保了唯一性,但是UUID的长度可能是一种威慑。除了uniqueidentifier字段之外,您可以考虑向products表添加顺序int或bigint标识值。然而,这将需要该列上的附加索引用于查找,尽管对于仅具有descritive字符串的Url将需要类似的索引。另一种方法是使用哈希值,例如按日期播种,您可以使用描述性名称进行组合。依赖数据库生成的顺序ID值更简单,但是如果您设想将来使用NoSQL存储机制,则可以考虑使用外部生成的哈希值进行追加。

答案 2 :(得分: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

答案 3 :(得分:0)

MVC路由(actions)将处理名称中的空格和斜杠。它将它们编码为%20,然后正确解码它们。

因此,您的网址为/products/oak%20table%2025x25-3%2F1