0

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

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

  1. 任务1.aspx ->任务1-1.aspx ->任务1-2.aspx
  2. task2.aspx->task2-1.aspx->task3-1.aspx
  3. task3.aspx->task3-1.aspx->task2.1aspx

在上面的 example.3 模块中还可以导航到其他页面。所以现在我遇到了问题,是否可以根据我来自的上一页实现后退按钮。例如,我点击

task3.aspx -> task3-1.aspx -> task2.1aspx

然后当我点击后退按钮时,将是

任务2.1aspx->任务3-1.aspx->任务3.aspx。

另一方面,当我单击 task2.aspx -> task2-1.aspx 时。

后退按钮会将我导航到 task2-1.aspx ->task2.apx

可以在服务器端完成吗?

4

3 回答 3

0

我这样做的方式与dbaseman 解释的方式有些相似。

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

因此,在用户单击每个后续重定向或链接时,您最终会得到一个越来越长的字符串。有时,URL 太长了。

我的解决方案是不存储返回BackUrl查询字符串参数的实际 URL,而只是存储一个哈希码。在服务器端,我有一个字符串字典(在用户会话中)来记住哈希码和实际的 URL。

在我的网站上单击任何“后退”按钮时,我会在该字典中进行查找,然后重定向到在字典中找到的给定哈希的匹配 URL。

这种方法的缺点可能是字典可能会随着时间的推移而增长并且永远不会缩小。不过,在我所有的现实世界项目中,这从来都不是问题。另外,如果会话被丢弃,它会被释放。

所以一个例子是:

  • task1.aspx中,不要将用户重定向到task1-1.aspx,而是重定向到task1-1.aspx?BackUrl=24378
  • 存储服务器端字典条目,映射24378task1-1.aspx.
  • task1-1.aspx?BackUrl=24378中,不要将用户重定向到task1-2.aspx,而是重定向到task1-2.aspx?BackUrl=93748
  • 存储服务器端字典条目,映射93748task1-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] );
}

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

于 2012-09-27T04:46:05.693 回答
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);
    }
}
于 2012-09-27T04:37:28.650 回答
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
于 2012-09-27T04:34:14.030 回答