层次结构导航后退按钮

时间:2012-09-27 04:28:54

标签: c# asp.net navigation hierarchy back

我需要为我的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
  4. 在上面的例子中,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

    是否可以在服务器端完成?

3 个答案:

答案 0 :(得分:0)

你可以这样做:

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

答案 1 :(得分:0)

我会使用Stack为此,并将其保留在Session中。在每个页面加载时,将当前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);
    }
}

答案 2 :(得分:0)

我的做法与dbaseman explains有点类似。

基本上,我将BackUrl查询字符串参数附加到我将客户端重定向到的每个URL以及用户可能单击的每个链接。此BackUrl参数包含当前页面的完整网址(包括所有参数)。

因此,在用户点击的每个后续重定向或链接上,您的字符串越来越长。有一段时间,网址太长了。

我的解决方案是不存储实际的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)。
  • 使用哈希码查看字典并获取实际网址。
  • 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;
    }
}

然后,您可以通过写入或从中读取字典来访问字典。

E.g。写信给词典:

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] );
}

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