我的做法与dbaseman explains 有点相似。
基本上,我将BackUrl 查询字符串参数附加到我将客户端重定向到的每个URL 以及用户可能单击的每个链接。这个BackUrl 参数包含当前页面的完整 URL(包括所有参数)。
因此,在用户单击每个后续重定向或链接时,您最终会得到一个越来越长的字符串。有时,URL 太长了。
我的解决方案是不将返回的实际 URL 存储在 BackUrl 查询字符串参数中,而仅存储哈希码。在服务器端,我有一个字符串字典(在用户会话中)来记住哈希码和实际 URL。
点击我网站上的任何“后退”按钮时,我会在此字典中进行查找,然后重定向到在字典中找到的给定哈希的匹配 URL。
这种方法的缺点可能是字典可能会随着时间的推移而增长并且永远不会缩小。不过,在我所有的现实世界项目中,这从来都不是问题。另外,如果会话被丢弃,它会被释放。
所以一个例子是:
- 在
task1.aspx 中,不要将用户重定向到task1-1.aspx,而是重定向到task1-1.aspx?BackUrl=24378。
- 存储服务器端字典条目,将
24378 映射到task1-1.aspx。
- 在
task1-1.aspx?BackUrl=24378 中,不要将用户重定向到task1-2.aspx,而是重定向到task1-2.aspx?BackUrl=93748。
- 存储服务器端字典条目,将
93748 映射到task1-1.aspx?BackUrl=24378。
- 等
然后你可以在你的页面上有一个后退按钮。
- 如果用户单击后退按钮,它会调用您的
void BackButton_Click 函数。
- 在该函数中,使用
Request["BackUrl"] 获取哈希码(例如24378)。
- 使用哈希码查找字典并获取实际 URL。
-
Response.Redirect 到该网址。
基本上就是这样。
伪代码:
一些伪代码使其更清晰。
对于字典,我会在 Page 派生的基类中给我写一个辅助属性,例如
protected Dictionary<string, string> BackUrls
{
get
{
var dic = Session["backdic"] as Dictionary<string, string>;
if ( dic == null )
{
dic = new Dictionary<string, string>();
}
return dic;
}
}
然后您可以通过写入或读取来访问字典。
例如写入字典:
private void goForwardToNextTask()
{
var hash = Math.Abs(Guid.NewGuid().GetHashCode());
// Store current page's full URL.
BackUrls[hash] = Request.RawUrl;
Response.Redirect( "task1-2.aspx?BackUrl=" + hash );
}
从字典中阅读:
private void goBackward()
{
var hash = Request["BackUrl"];
// Backward translation.
Response.Redirect( BackUrls[hash] );
}
(所有示例都省略了错误和完整性检查)。