【问题标题】:ASP.NET UpdatePanel: Make browser "back" button return to *last* version of the pageASP.NET UpdatePanel:使浏览器“返回”按钮返回到页面的*最后*版本
【发布时间】:2012-12-08 03:36:45
【问题描述】:

我有页面A和页面B。你可以在页面A中做以下事情:

  • 在页面 A 上执行操作(例如,在列表框中选择一个项目),这会导致页面 A 中的 UpdatePanel 被重新绘制并包含其他信息。
  • 转到页面 B。这是通过 Button 和 Response.Redirect 完成的。

现在问题如下:

  1. 用户在页面 A 上执行操作。页面 A 现在与其初始状态不同。
  2. 用户移动到页面 B。
  3. 用户点击浏览器的后退按钮。

会发生什么:显示页面 A 处于其初始状态
我希望发生的事情:显示页面 A 处于其最终状态(即,在列表框中选择了“正确”项目)。

我知道ScriptManager.AddHistoryPoint据我所知,它并没有解决我的问题:

  • 我可以打电话给AddHistoryPoint每次在页面 A 上完成了一些事情。这很糟糕,因为它在浏览器历史记录中留下了很多条目。 (每次都会选择一个新的条目。)但这正是我想通过使用 UpdatePanel 来避免的!当然,如果有ReplaceLastHistoryPoint的方法就完美了,但是我没找到……

  • 我试图在 Response.Redirect 之前调用 AddHistoryPoint,只保存页面 A 的 last 状态,但是,唉,这不起作用(没有历史记录点保存)。考虑到Response.Redirect 的工作原理,这并不奇怪。

我错过了一些解决方案吗?我正在使用 .NET 3.5SP1,以防万一。

【问题讨论】:

标签: c# asp.net .net asp.net-ajax updatepanel


【解决方案1】:

这是一个老问题,但我会继续提供我用于此问题的机制。基本思想是,与其让 AddHistoryPoint 管理您的名称-值对,不如让它管理您保存在其他地方的 NameValueCollection 的键,例如在会话缓存中。然后随着后续 Ajax 请求的到来,您再也不会调用 AddHistoryPoint;相反,您只需将 NameValueCollection 替换为当前请求的状态。

唯一的另一点是跟踪您是否正在进行第一次 Ajax 调用,是否需要对 AddHistoryPoint 进行第一次调用。

我的代码如下所示:

  protected void Page_LoadComplete(object sender, EventArgs e) {
     if (!ScriptManager.GetCurrent(this).IsNavigating && (IsCallback || IsInAsyncPostback())) {
        var state=new NameValueCollection();
        //OnCallbackHistory(state); // this gets state for all interested parties
        if (state.Count != 0) {
           string key=ViewState["HistoryStateKey"] as string;   // empty on first AJAX call
           if (string.IsNullOrEmpty(key) || ScriptManager.GetCurrent(this).EnableHistory) {
              key=CallbackHistoryKeyRoot+Interlocked.Increment(ref callbackHashKey).ToString();
              ViewState["HistoryStateKey"]=key;
              ScriptManager.GetCurrent(this).AddHistoryPoint("", key);
           }
           Session[key]=state;
        }
     }
  }

【讨论】:

    【解决方案2】:

    您可以使用 Sys.Application 类 http://msdn.microsoft.com/en-us/library/vstudio/cc488025(v=vs.90).aspx 在客户端上调用 addHistoryPoint,而不是在服务器上调用。

    因此,您需要向按钮添加客户端点击侦听器,该按钮将在客户端上添加HistoryPoint,然后按钮执行回发和重定向。

    【讨论】:

    • 好主意!不幸的是,如果在 JavaScript 中添加历史记录点,则 Navigate 事件也需要在 JavaScript 中处理(据我所知)。这增加了一些我宁愿避免的复杂性。所以,感谢您的想法,但我会暂时保留这个问题,以防有人提出其他解决方案。
    • 很公平,我会再试一次。与其在服务器端按钮单击处理程序中执行 Response.Redirect,不如只调用 AddHistoryPoint。那么响应返回的时候可以在客户端做一个location.href = B吗?
    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多