【问题标题】:Handling "Back Button"-Navigation in a ASP.NET MVC website处理“后退按钮”——ASP.NET MVC 网站中的导航
【发布时间】:2011-12-06 10:46:12
【问题描述】:

我们正在使用 ASP.NET MVC 实现一个简单的电话簿网站。它将使用 JQuery Mobile Framework 针对移动设备进行优化。该网站基本上由搜索表单、结果页面和详细信息页面组成。

工作流程

填写搜索表单,发布到结果控制器,显示结果。 用户选择一个结果并获取该单个结果的详细信息。 详细信息显示在单独的站点上。站点获取单个结果的 id 作为 get 参数,填充一个 DetailModel 并将模型传递给视图以呈现它。

工作正常

进行搜索、获取结果、显示详细信息都可以正常工作。 进行搜索、获取结果、导航回搜索、优化字段、搜索.. 工作查找。

问题

进行搜索,获取结果,显示详细信息,然后返回结果页面......我如何获得最新的搜索结果?这是一个 GET 请求。模型 (RequestResults) 为空。我应该如何存储这些信息?会议?实现这样一个要求的“正确方法”是什么?

感谢您提供正确方向的任何提示 亚历克斯

更新 18:12

为了阐明当前的工作流程是怎样的: 搜索表单通过 POST 提交到结果页面。结果页面获取 SearchRequestModel 的实例并针对数据库运行搜索。然后显示结果。每个结果都包含一个指向详细信息页面的链接,其中显示了有关此特定结果的更多信息。该链接是通过 GET 调用的。在点击此链接后,有关我的初始搜索请求和结果的所有信息都会丢失。如何返回结果视图?

有人知道面临这个问题的实现吗?

【问题讨论】:

    标签: asp.net-mvc session-state back-button


    【解决方案1】:

    问题是页面被浏览器缓存,因此没有执行控制器操作。在 ASP.NET MVC 中,您可以使用以下代码来装饰动作来避免这种情况:

    [OutputCache(NoStore = true, Duration = 1)]
    

    这告诉浏览器不要使用缓存并执行服务器代码。 您也可以为所有操作指定此选项,但不推荐这样做,因为在许多情况下,最好从缓存中获取页面,因为它不会导致任何问题并最大限度地减少资源的使用。

    【讨论】:

    • 聪明。唯一让这个解决方案不完美的是需要设置一秒缓存......
    【解决方案2】:

    您面临的问题是大多数浏览器会缓存上一页,当您返回时,并没有使用实际的网络连接来加载页面,浏览器甚至不会考虑在服务器上进行检查。

    您可能无法控制客户端浏览器设置。我发现的唯一easy 解决方案(这是相对的)是您通过Ajax 加载该页面。请记住,如果您调用相同的 URL,IE 也会缓存 Ajax 调用。因此,您可以进行 ajaxcall 并在末尾添加一个不断变化的无用参数(例如时间戳)。

    这是一个(MVC 2)示例

    $(document).ready(function (event) {
            $.ajax({
                url: '<%= Url.Action("LoadPageContents", "Controllername") %>',
                data: "ID=" + *thevalueyouneed* + "&date=" + new Date().getTime(),
                success: function (data) {
                    //In my case, a partial View is returned
                    $("#containingDiv").html(data);
                }
            });
        });
    

    当然,如果该页面应该包含大量数据,则可能不适合通过 Ajax 传输所有数据。

    有一个更简单的解决方案是向页面添加无缓存元标记,如下所示:

    <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
    

    但我从来没有让它在跨浏览器上正常工作。

    【讨论】:

    • 感谢您的回答。如果网站被缓存,那就太好了。但我只得到一个没有任何搜索结果的空站点。我将在我的问题中添加评论,以澄清会发生什么以及我期望什么。
    • 好的,改变事情,同意:) 也没有找到解决方案。虽然对我来说,只有当您收到应用程序错误时才会发生这种情况,然后返回,否则对我来说它可以正常工作。
    【解决方案3】:

    尝试将表单更改为 GET 而不是 POST。这会将所有表单参数放入查询字符串中。在您的情况下,这可能是理想的,也可能不是理想的,但可以解决问题,因为浏览器会记住您的历史记录。

    这就是 Google 的做法。

    希望这会有所帮助,

    标记

    【讨论】:

    • 嗨,马克,感谢您的建议。对于目前的情况,这将是一个可能的解决方案。使用的表单只包含几个字段,因此不会有 URL 长度限制的问题。
    猜你喜欢
    • 2018-09-26
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2011-02-07
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多