【问题标题】:Hierarchy navigation back button层次导航返回按钮
【发布时间】:2012-09-27 04:28:54
【问题描述】:

我需要为我的 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

在上面的example.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

可以在服务器端完成吗?

【问题讨论】:

    标签: c# asp.net navigation hierarchy back


    【解决方案1】:

    我会为此使用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】:

    你可以这样做:

    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
    

    【讨论】:

    • 这将不允许在多个页面上“返回”。
    • 对不起。我以前试试。它会导致错误。例如。任务3.aspx -> 任务3-1.aspx -> 任务2.1aspx。然后当我单击返回 2.1aspx -> task3-1.aspx。它不能回到task3.aspx。它会引导我回到 task3-1.aspx
    【解决方案3】:

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

    基本上,我将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。
    • 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] );
    }
    

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

    【讨论】:

    • 对不起。能给我举个例子吗?
    • 嗨,还有一个问题。假设现在在 task1-2.aspx 中的用户,他来自 task1.aspx ->task1-1.aspx ->task1-2.aspx。所以当他单击返回按钮时,他应该重定向到 task1-1.aspx,然后再次单击返回。它将回到task1.aspx。那么我应该如何为查询字符串参数赋值呢?
    • @user998405 实际上,我想我已经在回答中解释了这一点。每个字典条目都包含一个 URL,其中包含 BackUrl 参数中另一个字典条目的哈希码。这可以任意嵌套。
    • 对不起。我对aspx还是很新鲜的。对字典输入不太了解。我先试试。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2017-11-14
    相关资源
    最近更新 更多