层次导航返回按钮



我需要为我的asp应用程序实现一个后退按钮。

在我的网络应用程序中,我得到了3个模块的

  1. task1.aspx->task1-1.aspx->task1-2.aspx
  2. task2.aspx->task2-1.aspx->task3-1.aspx
  3. 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] );
}

(所有示例都省略了错误和健全性检查)。

相关内容

  • 没有找到相关文章

最新更新