如何建立“后退”链接?

时间:2009-06-02 08:20:15

标签: asp.net-mvc

我有一个从不同地方调用的详细信息页面,并且有一个很好的可读网址,如

“www.mypage.com/product/best-product-ever”。

调用页面(产品列表)有一个更复杂的网址,如:

“www.mypage.com/offers/category/electronic/page/1/filter/manufacturer/sony/sort/price”和

“www.mypage.com/bestseller/this-week”。

如何从详细信息页面到主叫产品列表进行反向链接?

  • 我不能使用javascript
  • 我不希望在网址中有调用页面,因为它很长
  • 我真的想要页面之间的链接,没有http-post
  • 我不能使用Sessionstate

编辑: Sessionstate被排除,因为如果有2个Windows打开,那么他们将共享相同的“返回”页面信息。

5 个答案:

答案 0 :(得分:4)

像李说的那样,使用引荐来源值:

<a href="<%= Html.Encode(Request.UrlReferrer.ToString()) %>">Back</a>

如果您不想要链接中的URL,因为它太长,请尝试在URL上运行某种简单的压缩算法,将压缩数据显示为unicode文本,然后将压缩的URL作为参数附加到重定向页面,例如:

<a href="Redirect.aspx?u=compressed_url_goes_here">Back</a>

答案 1 :(得分:2)

使用引荐来源标头值怎么样?

答案 2 :(得分:1)

这是一个疯狂的想法,需要公平但工作,可能不健康的性能(取决于您的用户)..但在这里我们去:

创建一个用于缓存“ListResults”的存储库(并将其连接到您喜欢的数据库中,或者只是将其留在服务器的内存中)。 简而言之,这个Repo可以做的是存储一个ListResult,它将包含所有内容以保持任何给定用户正在查看的列表的当前视图的状态。这可能包括路由和其他值..但基本上是重定向到过滤和排序列表的特定页面所需的一切。

ListResult项添加到repo时,会生成一个小的唯一散列/密钥,它将是url友好的 - 类似于“k29shjk4” - 它会与日期时间戳一起添加到项目中。 / p>

ListResult仅在列表离开默认视图时保持不变(即没有过滤,排序和第1页) - 这将有助于提高性能。

ListResult项可能永远不会被使用,但特定列表视图上的所有详细操作链接都会将ListResult.Key哈希值添加到路径中。所以,是的,它最终可能会成为一个查询字符串,但它会很短(网址友好),如果你想要更多的路线,你可以进一步整理它。

要向列表“返回”导航,您可能需要一个新的小型控制器,它只接受ListResult.Key哈希值并重定向/重新创建列表视图的状态(包括分页,过滤和排序)来自回购中的查询。

所以到目前为止我们已经满足了这些要求:url中没有调用页面(从某种意义上说它不是整个页面 - 只是对它的哈希查找);没有POST,没有会话,没有js。

要阻止ListResult repo变大(并且危险:如果你将它保存到数据库中),你可以使用ASP.NET background service定期修剪'旧'路由timestamp ..和'延长'在通过新控制器请求时,通过向ListResult项目的戳记添加时间来持续使用的路由的生命周期。如果用户想要永久链接到列表视图,则无需无限期地保留路由,他们可以为长列表路由本身添加书签。

希望这有所帮助

答案 3 :(得分:0)

你有饼干吗?

如果是这样,您可以将其放在那里,或者用它来创建自己的会话状态。

答案 4 :(得分:0)

我认为这更像是“返回结果”,然后是通用的“&lt;&lt;&lt; back”链接,因为您希望通用的反向链接返回到遗传列表,而不是您描述的严重过滤的列表,正确?

我不知道这是否属于您的“无帖子”状态,但我能看到的唯一选择是Detail操作仅限POST([AcceptVerbs(HttpVerbs.Post)])并包含其他参数比如string fullRoute,它会在详细信息页面上转换为“返回结果”的“链接”。重载缺少Detail参数的fullRoute操作,并将重载操作作为GET操作,以便不需要POST fullRoute值(当用户可以使用'generic'“返回”链接时) 。这应该同时提供对“详细信息”页面的“通用”GET请求和POST请求,后者将包含已过滤列表的特定“返回结果”链接。