代码之家  ›  专栏  ›  技术社区  ›  Mathias F

如何建立“后退”链接?

  •  4
  • Mathias F  · 技术社区  · 15 年前

    我有一个从不同地方调用的详细页面,它有一个可读性很好的URL,比如

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

    调用页面(产品列表)具有更复杂的URL,如:

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

    “www.mypage.com/bestseller/本周”。

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

    • 我不能使用javascript
    • 我不想在URL中包含调用页,因为它会变长
    • 我真的想要网页之间的链接,没有HTTP帖子
    • 我不能使用sessionstate

    编辑: sessionstate被排除在外,因为如果有两个窗口打开,那么它们将共享相同的“后退”页面信息。

    5 回复  |  直到 15 年前
        1
  •  4
  •   Nathan Ridley    15 年前

    如李所说,使用引用值:

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

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

    <a href="Redirect.aspx?u=compressed_url_goes_here">Back</a>
    
        2
  •  2
  •   Leo    15 年前

    使用referer头值怎么样?

        3
  •  1
  •   Matt Kocaj    15 年前

    这里有一个疯狂的想法,需要一个公平的工作,可能不健康的表现(取决于你的用户)。但是我们走了:

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

    作为 列表结果 项目被添加到repo中,生成一个小的唯一哈希/键,它将是对URL友好的-类似于“k29shjk4”-它与日期时间戳一起添加到项目中。

    列表结果 只有当列表脱离默认视图(即没有过滤、排序和第1页)时,s才会被持久化——这对性能有一点帮助。

    列表结果 项可能永远不会实际使用,但特定列表视图上的所有详细操作链接都具有 ListResult.Key 添加到路由的哈希值。所以是的,它可能会以一个查询字符串结束,但它会很短(URL友好),如果你想更多地处理路由,你可以进一步整理它。

    对于“返回”到列表的导航,您可能需要一个新的小控制器,它只接受 列表结果 散列值和重定向/重新创建列表视图的状态(包括分页、筛选和排序),从repo中的查找开始。

    因此,到目前为止,我们已经满足了这些要求:URL中没有调用页面(从某种意义上说,它不是整个页面——只是它的散列查询);没有发布,没有会话,没有JS。

    停止 列表结果 从大到大(和危险:如果你坚持到数据库),你可以使用 ASP.NET background service 通过时间戳定期修剪“旧”路由。并通过增加时间来“延长”持续使用的路线的寿命。 列表结果 通过新控制器请求时的项目。不需要无限期地保持路由,因为如果用户想要列表视图的永久链接,他们可以将长列表路由本身标记为书签。

    希望这能有所帮助

        4
  •  0
  •   Rik Heywood    15 年前

    你有饼干吗?

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

        5
  •  0
  •   Svante    15 年前

    我认为这更像是一个“返回结果”的链接,而不是一个“返回结果”的链接,因为您希望通用的返回链接返回到遗传列表,而不是您描述的经过严格筛选的列表,对吗?

    我不知道这是否属于你的“禁止入职”条件,但我能看到的唯一选择是 Detail 操作仅为发布( [AcceptVerbs(HttpVerbs.Post)] )包括另一个参数,比如 string fullRoute 在“返回结果”的详细信息页上转换为“链接”。超载 细节 缺少的操作 fullRoute 参数并使重载操作成为get操作,这样就不需要post fullroute值(当用户可以使用“generic”的“back”链接时)。这应该同时为“一般”的获取详细信息页面的请求和post请求提供服务,后者将包括筛选列表的特定“返回结果”链接。