9

我有页面 A 和页面 B。您可以在页面 A 中执行以下操作:

  • 在页面 A 上做一些事情(例如,在列表框中选择一个项目),这会导致页面 A 中的 UpdatePanel 用附加信息重新绘制。
  • 转到页面 B。这是通过 Button 和 完成的Response.Redirect

现在问题如下:

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

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

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

  • AddHistoryPoint 每次在页面 A 上完成某些操作时,我都可以调用它。这很糟糕,因为它会在浏览器历史记录中留下大量条目。(每次选择不同的列表框项时都会出现一个新条目。)但这正是我想通过使用 UpdatePanel 来避免的!当然,如果有ReplaceLastHistoryPoint办法,那就完美了,但是我没有找到……

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

有没有我错过的解决方案?我正在使用 .NET 3.5SP1,以防万一。

4

2 回答 2

3

这是一个老问题,但我会继续提供我用于此的机制。基本思想是,与其让 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;
        }
     }
  }
于 2013-09-17T15:49:18.007 回答
2

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

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

于 2012-12-20T15:35:19.850 回答