我需要为我的asp应用程序实现一个后退按钮。
在我的网络应用程序中,我得到了3个模块的
- task1.aspx->task1-1.aspx->task1-2.aspx
- task2.aspx->task2-1.aspx->task3-1.aspx
- task3.aspx->task3-1.aspx->task2.1aspx
在上面的例子中,.3模块也可以导航到其他页面。所以现在我遇到了一个问题,是否可以根据我来自的上一页实现后退按钮。例如,我点击
task3.aspx->task3-1.aspx->task2.1aspx
然后当我点击后退按钮时,将是
task2.1aspx->task3-1.aspx->task3.aspx.
另一方面,当我单击task2.aspx->task2-1.aspx时。
后退按钮将导航到task2-1.aspx->task2.apx
有可能在服务器端完成吗?
我会为此使用堆栈,并将其保存在会话中。在每次加载页面时,将当前URL推送到堆栈中。
void Page_Init()
{
Stack<string> history = Session["history"];
if (history == null) history = new Stack<string>();
history.Push(Request.Url.AbsoluteUri);
Session["history"] = history;
}
当然,在点击处理程序中:
void Back_Click()
{
Stack<string> history = Session["history"];
if (history != null)
{
string url = history.Pop();
Session["history"] = history;
Response.Redirect(url);
}
}
您可以这样做:
static string prevPage = String.Empty;
protected void Page_Load(object sender, EventArgs e)
{
if( !IsPostBack )
{
prevPage = Request.UrlReferrer.ToString();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect(prevPage);
}
对于多源跨页发布,建议使用
<%@ PreviousPageType TypeName
而不是
<%@ PreviousPageType VirtualPath
我做这件事的方式与dbaseman解释的方式有些相似。
基本上,我将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
- CCD_ 17到该URL
基本上就是这个想法。
伪代码:
一些伪代码使其更加清晰。
对于字典,我会在Page
派生的基类中给我写一个helper属性,比如
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] );
}
(所有示例都省略了错误和健全性检查)。