【问题标题】:best practice for page navigation页面导航的最佳实践
【发布时间】:2014-07-30 04:02:43
【问题描述】:

在大多数网站中,总是有一个“返回”到上一个按钮。我想知道它们通常会被实施。

基本上,我正在构建一个页面深度超过 5 级的网站。例如,页面级别如下:

高级搜索 => 搜索结果 => 搜索详细信息 => 申请工作 => 保存工作

我需要确保用户可以导航回上面的上一级,因此从“搜索详细信息”中,他们应该能够单击返回,然后返回包含所有以前搜索条件的“搜索结果”页面保存。

我目前将“返回 url”存储为查询字符串参数的一部分,并在用户深入研究时附加该 url。这样做的问题是,当用户潜入超过 3 个级别时,URL 会变得非常长且混乱。

asp.net MVC 应用程序处理此类问题的最佳做法是什么?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    I am currently storing the "back url" as part of the query string paramter and append the url as user dives in deeper. The issue with this is that when as user dives in more than 3 levels, the url get really long and messy.

    不要将其存储在您的网址中,而是存储在您的会话中。您可以轻松地创建一个类(如果有意义的话),封装您想要的所有内容,然后将其粘贴到您的会话中。如果您只是在存储最后一页的 url 之后,只需在会话中存储一个字符串。

    Session["lastPage"] = "~/mypage.aspx";
    

    这比将所有内容都附加到您的 url 更干净(也更安全)。在这里使用 javascript 不是一个好的选择。

    【讨论】:

    • 存储在会话中可能会导致网络农场出现问题,会话存储在特定服务器的 RAM 中。当用户请求通过 webfarm 中的不同服务器获取服务器时,Session["lastPage"] 将为 null
    • @Jack,首先,您可以在 webfarm 环境中使用会话,这没有什么问题。例如,请参阅此链接:stackoverflow.com/questions/686873/…。如果您因其他原因无法使用会话,或者只是不想使用会话,则始终可以使用 cookie。但是将 url 粘贴到当前 url...err.. 好吧,这是您的选择,但如果我还有其他选项可供选择,我个人不会这样做。
    【解决方案2】:

    在我(几年前)使用过的旧 Web 开发平台中,这是使用内置函数解决的。这个想法是服务器维护某种内部 url 集合并将它们映射到简单的数字。当您向集合中添加新的 url 时,服务器将首先检查该确切的 url 是否已经存在,如果存在,则返回关联的数字。如果您添加的 url 是新的,它将被添加并返回一个新的数字。

    几个示例来说明...假设用户从页面开始:

    http://foo.bar.com/search/
    

    我将此页面称为“第 1 页”。添加搜索条件后,用户将在页面上看到结果:

    http://foo.bar.com/search/results?jobTitle=CEO&etc&etc
    

    我称之为“第 2 页”。在此页面上,用户可以单击打开特定结果并进入页面:

    http://foo.bar.com/search/results/12313
    

    我称之为“第 3 页”。

    要使第 2 页和第 3 页具有“返回上一页”功能,需要使用一个额外的查询参数打开它们。当第 1 页生成第 2 页的 url 时,服务器将调用实用方法 SaveUrl()(在某个合适的类上)并将结果附加到查询字符串,因此第 2 页的 url 变为:

    http://foo.bar.com/search/results?jobTitle=CEO&etc&etc&return_url=1
    

    注意新的return_url=1 查询参数。然后第 2 页将使用相应的 GetReturnUrl(1) 方法来获取要在“返回上一个”链接中使用的 url。此调用将带回之前添加的 url,即http://foo.bar.com/search/

    从第 2 页前进到第 3 页还需要使用相同的 SaveUrl() 添加新的查询字符串参数。第 3 页的新 url 将是:

    http://foo.bar.com/search/results/12313?return_url=2
    

    在第 3 页上,将使用 GetReturnUrl(2) 获取“返回上一个”页面 url,这将返回 http://foo.bar.com/search/results?jobTitle=CEO&etc&etc&return_url=1

    因此,该系统通过存储当前页面的 url 并将其提供给下一页的 url 来工作。并且由于当前页面的 url 以查询参数的形式包含了对当前页面上一页的引用,所以会保持回上一页的踪迹。

    我想我会解释这一点,因为我认为这是处理返回到上一个线索的聪明方法。我并不是说这是任何行业标准或最佳实践......

    编辑:关于这种方法的一些想法和考虑。

    优点:

    • 存储和检索 url 的简便方法,不会导致查询字符串变长

    缺点:

    • 只要 url 包含返回所需的所有状态即可。
    • 根据实现细节(全局 url 集合?Session 中的用户特定 url 集合?保留在 Sql 服务器中?)它可能会导致 Web 场出现问题(所有服务器需要就存储为“1”的 url 达成一致)。
    • 可能会导致高流量网站出现内存问题(但这也取决于具体的实现方式)

    【讨论】:

    • 好主意!我想过类似的事情,通过将用户流存储在存储中的堆栈对象中,当用户向后移动时弹出它。感谢您的详细解释
    【解决方案3】:

    让浏览器处理后退按钮,并且根本不(再次)将其添加到您的网站,因为会有很多问题,例如用户打开新页面、新标签或在同一页面上发帖页面 - 或者来自其他站点然后后面不是你想的那样。

    您可以添加的是行菜单和/或树形菜单,以及您从一开始就知道的下一页/上一页。

    【讨论】:

    • 树形菜单不是细节的一部分,我们在实现它们时没有选择,通常树形菜单中的链接没有搜索查询参数
    • @Jack 好的,但页面内的后退按钮不是最佳做法。
    • @Aristos - 如果浏览器已经有一个“返回”按钮,我们是否应该实现一个“返回”按钮是有争议的。但是,有时我们希望浏览器在用户通过 POST 成功提交页面后返回上一页。不知何故,服务器需要知道将它们发送到哪里,如果导航结构很深,并且有多种到达任何特定页面的方式,这可能会很困难。
    【解决方案4】:

    试试这个旧的 javascript 方法

    <a href="javascript:history.go(-1)">Go Back</a>
    

    <input type="button" value="Go Back" onclick="history.go(-1)" />
    

    这应该在每个页面上,但不能保证在所有情况下都能正常工作

    【讨论】:

    • 如果用户来自其他站点,这会将他们带回该站点而不是我站点中的页面
    • 在那个状态下,你的站点没有之前的状态,所以是正常的。
    • 我认为任何用户都不会期望在一个站点中点击“后退按钮”并转到另一个站点的行为。
    猜你喜欢
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多