我有A页和B页。您可以在A页中执行以下操作:
Response.Redirect
完成的。 现在问题如下:
会发生什么:显示页面A处于初始状态。
我想发生的事情:页面A处于最终状态(即在列表框中选择了“正确”项目)。
我知道ScriptManager.AddHistoryPoint! 据我所知,它不能解决我的问题:
AddHistoryPoint
。这很糟糕,因为它在浏览器历史记录中堆积了很多条目。 (每次选择一个不同的列表框项目时,都会有一个新条目。)但是,这正是我要使用UpdatePanel避免的功能!当然,如果有一种ReplaceLastHistoryPoint
方法,那将是完美的,但是我没有找到一个... AddHistoryPoint
之前立即调用Response.Redirect
,以仅保存页面A的最后状态,但是,a,这行不通(没有保存历史记录点)。考虑到Response.Redirect
的工作原理,这并不奇怪。 我错过了一些解决方案吗?我正在使用.NET 3.5SP1,以防万一。
最佳答案
这是一个古老的问题,但是我将继续并提供用于此目的的机制。基本思想是,与其允许AddHistoryPoint管理您的名称/值对,不如让它管理您保存在其他位置(例如在 session 缓存中)的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;
}
}
}
关于c# - ASP.NET UpdatePanel : Make browser "back" button return to *last* version of the page,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13975176/