我这样做的方式与dbaseman 解释的方式有些相似。
基本上,我将一个BackUrl
查询字符串参数附加到我将客户端重定向到每个 URL 以及用户可能单击的每个链接。该BackUrl
参数包含当前页面的完整URL(包括所有参数)。
因此,在用户单击每个后续重定向或链接时,您最终会得到一个越来越长的字符串。有时,URL 太长了。
我的解决方案是不存储返回BackUrl
查询字符串参数的实际 URL,而只是存储一个哈希码。在服务器端,我有一个字符串字典(在用户会话中)来记住哈希码和实际的 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] );
}
(所有示例都省略了错误和完整性检查)。