Asp.net mvc ASP.NET MVC指定URL路由之外的类别/路径

Asp.net mvc ASP.NET MVC指定URL路由之外的类别/路径,asp.net-mvc,url,cookies,routing,Asp.net Mvc,Url,Cookies,Routing,我在决定将类别/路径放在URL路由上时遇到问题。假设我的示例Web应用程序中有一些附加到某些类别的产品。例如: Book1 Attached to -> Category1 | Category2 Book2 Attached to -> Category1 | Category2 | Category3 Book3 Attached to -> Category2 | Category3 为产品定义的路线图为: url: "{controller}/{action}/{l

我在决定将类别/路径放在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)。我考虑使用会话变量查看包甚至Cookie,但它们都有各自的局限性和缺点。例如,使用cookie可能会导致一些问题:如果设置的过期时间太小,当用户在某些页面上暂停时可能会丢失当前路径,如果设置的时间太长,可能会导致用户进入旧的浏览路径,甚至用户在新打开的浏览器中请求主页,因为存在cookie(除此之外,我有一些使用Cookie的经验,我相信这并不总是有效的),关于会话查看包我不知道使用它们是否是最好的主意,所以有人能分享经过测试的解决方案或好主意吗?我会很感激的。

你应该拥有mywebsite.com/product1页面(URL的规范版本)。包括所有版本的URL不会有帮助。很可能,这只会混淆Google,并可能导致Google忽略某些URL

即使您输入了规范版本,并且页面上有rel canonical标记,谷歌仍可能选择将URL的另一个版本视为规范


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

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

然后,您将拥有如下URL:

{domain}/{controller}/book/id

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

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


在我看来,这仍然是非常平静的,也更简单。

我惊讶于没有任何评论、描述或理由的否决投票。我将我的50分定为悬赏,因为你的答案对我来说非常重要。如果你理解我的问题并了解解决方案,那么请回答,否则请留下它。如果你认为这是一个愚蠢的问题,决定投反对票,至少写一条评论,说出你的理由。谢谢大家。谢谢你的回答,但最重要的是如何存储和跟踪所选类别?将URL重定向到非类别版本后,我会丢失它,我错了吗?因为你是这个问题的唯一回复者,我会给你答案u悬赏如果没有其他更好的答案,在到期前回答,但没有标记为答案,因为我还不相信这个答案。我认为@Mikaal应该得到悬赏,但我感谢你的注意,我会指出你的答案+1,再次感谢。我不希望URL的形式为“?param=value&…”你可以看看很棒的网站,你会看到语言代码是URL的一部分,比如“/en/…”由于某些内容可能存在于一种语言中,而不存在于另一种语言中,因此在URL中包含语言代码是合乎逻辑的,但关于类别,您可以从不同类别导航到特殊产品,该产品是唯一的,但属于类别!我需要知道没有URL的类别。如果您想避免在URL中包含任何内容,可以执行以下操作:POST请求而不是GET请求,这样它们就不会显示在URL中。如果您希望跟踪类别而不必将其存储在URL中,则可以:1)将其作为请求参数传递(在POST或GET请求中,取决于您是否希望其显示在URL中)。2)使用ViewBag传递。如果您想将其保留更长的时间,可以将其添加到会话中,但是您还必须确保在切换类别时更新它。阅读您上面的问题,我建议您在“会话”/“视图包”/“请求参数”中只存储“categoryName/categoryId”,而不是“路径”。当然。。。请务必给出阅读要点#4与您的查询非常相关。太好了!谢谢我希望我们的讨论有助于至少更接近达成一个确切的解决方案。如果我能给你一个更准确的答案,我会告诉你的。