【问题标题】:ASP.NET MVC Specify Category/Path outside of URL RoutingASP.NET MVC 在 URL 路由之外指定类别/路径
【发布时间】:2018-05-01 16:34:27
【问题描述】:

我在决定将类别/路径放在 URL 路由上时遇到问题。假设我的示例 Web 应用程序中有一些附加到某些类别的产品。例如:

Book1 Attached to -> Category1 | Category2 
Book2 Attached to -> Category1 | Category2 | Category3
Book3 Attached to -> Category2 | Category3

并且为产品定义的路由图是:

url: "{controller}/{action}/{languageCode}/{category}/{product}"
defaults: new { controller = "Home", action = "ViewItem" }

所以 Book1 的可能路由是:

[Domain Name]/Home/ViewItem/en-US/Category1/Book1
[Domain Name]/Home/ViewItem/en-US/Category2/Book1

Book2 的可能路由是:

[Domain Name]/Home/ViewItem/en-US/Category1/Book2
[Domain Name]/Home/ViewItem/en-US/Category2/Book2
[Domain Name]/Home/ViewItem/en-US/Category3/Book2

我想保存并了解当前类别,但每个产品都有一个唯一的 URL(用于搜索引擎跟踪和共享 URL 的目的)。我考虑使用 Session VariableViewBag 甚至 Cookie,但它们各有其局限性和缺点。例如使用 cookie 可能会带来一些麻烦:如果设置的过期时间太小,当用户在某些页面上暂停时可能会丢失当前路径,如果设置太长,即使用户请求,也可能导致用户回到旧的浏览路径由于现有 cookie,在新打开的浏览器中打开主页(除此之外,我对 cookie 有一些经验,我相信这并非一直都能正常工作),关于 SessionViewBag 我不知道使用它们是否是最好的主意,那么任何人都可以分享经过测试的解决方案或好主意吗?我会很感激的。

【问题讨论】:

  • 我对没有任何 cmets、描述或理由的投票感到惊讶。我将我的 50 宝贵点设置为赏金,因为您的回答对我来说非常重要。如果您理解我的问题并了解解决方案,请回答,否则请离开。如果您认为这是一个愚蠢的问题并决定投反对票,请至少写一条评论并说出您的理由。谢谢大家。

标签: asp.net-mvc url cookies routing


【解决方案1】:

您应该拥有页面 mywebsite.com/product1(URL 的规范版本)。包括所有版本的 URL 将无济于事。很可能,它只会让 Google 感到困惑,并可能导致 Google 忽略某些 URL

即使您输入了规范版本并在您的网页上添加了 rel 规范标签,Google 仍可能选择将其他版本的网址视为规范。

理想情况下,我会在这里解决真正的问题,并且在您的网站上只保留一个版本的产品 URL(将 URL 中具有类别的版本重定向到 URL 中没有类别的 URL 版本)。这样您甚至不必担心重复内容可能导致的所有问题。

【讨论】:

  • 感谢您的回答,但最重要的是如何存储和跟踪所选类别?将 URL 重定向到非类别版本后,我会丢失它,我错了吗?
  • 因为你是这个问题的唯一回复者,如果在到期前没有其他更好的答案,我会给你赏金,但没有标记为答案,因为我不相信这个答案还没有。
  • 我认为 @Mikaal 应该得到赏金,但我感谢你的关注,我会指出你的答案 +1,再次感谢。
【解决方案2】:

我怀疑这不是路由问题,而是架构问题。我认为“语言代码”和“类别”应该是 Book 对象的一个​​属性,而不是路由的一部分。

然后你会有这样的 URL:

{domain}/{controller}/book/id

对于“类别”特定或“语言代码”特定视图,您可以使用如下 URL:

{domain}/{controller}/search?languageCode=enUS&category=1

这仍然是完全 RESTful 的,在我看来,也更简单。

【讨论】:

  • 我不想使用“?param=value&...”形式的 URL,您可以查看优秀的网站,您会看到语言代码是 URL 的一部分,例如“/en/. ..” 因为某些内容可能存在于一种语言中而另一种语言中不存在,因此在 URL 中包含语言代码是合乎逻辑的,但是关于类别,您可以从不同类别导航到特殊产品,该产品是唯一的但类别!我需要在没有 URL 的情况下知道类别。
  • 如果您想避免在 URL 中包含任何内容,您可以执行 POST 请求而不是 GET,这样它们就不会出现在 URL 中。
  • 如果您想跟踪类别而不必将其存储在 URL 中,您可以: 1) 将其作为请求参数传递(在 POST 或 GET 请求中,取决于是否不是您希望它显示在 URL 中)。 2) 使用 ViewBag 传递它。如果您想将其保留更长时间,您可以将其添加到会话中,但您还必须确保在切换类别时更新它。从您上面的问题中阅读,我建议您仅将“categoryName/categoryId”存储在“Session”/“ViewBag”/“Request Parameter”而不是“Path”中。
  • 当然……请阅读moz.com/blog/15-seo-best-practices-for-structuring-urls第4点与您的查询非常相关。
  • 太棒了!谢谢。我希望我们的讨论至少有助于接近(如果没有达到确切的解决方案)。如果我有更准确的答案,我会告诉你的。
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 2010-11-22
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多