做过网站或WEB系统的,肯定都曾在自己的页面中用过“返回”按钮。我也不例外,在多次的开发中,我曾经思索:这个小小的“返回”按钮,应该以怎样的代码实现比较好。

  先说说自己最常使用的,也是最常见最无脑的。如:

1         protected void Back()
2         {
3             Response.Redirect("CurrList.aspx");
4         }

  有时候,当返回的页面的是一个带分页的页面时,则需要在进入页面时传入分页信息,然后在返回时取出这些值。比如:

1     private void Goback()
2     {
3         string size = Request.QueryString["size"];
4         string index = Request.QueryString["index"];
5            Response.Redirect("SellInfoDisplay.aspx?size=" + size + "&index=" + index );
6     }

用的最多的,无非以上了。

  有的时候,再复杂一些,比如一个页面可以从不同的页面跳入,那么,还得再记录哪个页面来的,返回的时候,再判断判断。

  再有的时候,A页面跳到B页面,B页面再跳到C页面,这个时候想要连着两次返回到A页面,要写的代码就多了。

  那么,这个小小的“返回”按钮有没有什么好的方法去处理呢?

  首先我尝试了这样的方法:

1 history.go(-1);

  曾经在某些页面中用过这样的方法,似乎也没什么问题。但这个方法是有使用范围限制的,通常它适合用在静态页面。另外,当跳转之前页面执行了某个脚本,而这个脚本中alert了一下,此时用这个方法跳转回来的时候,我发现它又alert了一下,这显然不行。

  接着我又尝试了这样的方法:

1     protected void SaveCurrURL() 
2     { 
3         Session["prevURL"] = Request.UrlReferrer.PathAndQuery; 
4     } 
5  
6     protected string  GetCurrURL() 
7     { 
8         return Session["prevURL"].ToString(); 
9     }
10 
11     protected void Back()
12     {
13         Response.Redirect(this.GetCurrURL());
14     }

  前两个方法写在自定义的页面基类中,并且我约定了系统中总是将分页,查询,排序等参数信息保存在URL中。接着我制作了对应的分页控件,正当我沾沾自喜,以为大功告成的时候,又一个问题出现了。

  Request .UrlReferrer .PathAndQuery 这句代码似乎会有失灵的时候。

  经过几次尝试,发现问题是这样的:

假设从A页面跳转至B页面,那么A页面的方式如果是以脚本的方式进行跳转的话,那么在B页面调用SaveCurrURL方法是获取不到预期的值的,比如(location.href=。。。。),而在A页面以超链接的方式进行跳转的话,则可以顺利获取到。

这是何故?又怎麽办呢?我们知道,用户点击超链接属于用户主动行为,而脚本触发,则属于被动行为,有时候某些被动行为会因为安全方面的考虑而受到重重阻碍。我们可以以脚本的方式触发超链接元素的onclick事件,确很难模拟用户直接点击超链接的效果(我认为是不能)。

后来我决定退一步,牺牲一下性能,将代码改成Session["prevURL"] = Request.Url.PathAndQuery;

并且为了支持两级的返回,最后的代码是这样的

1     protected void SaveCurrURL(bool first)
2     {
3         if (Session["prevURL"] == null)
4             Session["prevURL"] = new string[3];
5         string[] urls = (string[])Session["prevURL"];
6         if (first)
7         {
8             urls[0] = Request.Url.PathAndQuery;
9             urls[1] = null;
10             urls[2] = null;
11         }
12         else
13         {
14             if (urls[1] == null)
15                 urls[1] = Request.Url.PathAndQuery;
16             else
17                 urls[2] = Request.Url.PathAndQuery;
18         }
19         Session["prevURL"] = urls;
20     }
21     ///<summary>
22 /// 获取上次保存的URL23 ///</summary>
24 ///<returns></returns>
25     protected string  GetCurrURL()
26     {
27         string[] urls = (string[])Session["prevURL"];
28         for (int i = 2; i >= 0; i--)
29         {
30             if (urls[i] != null)
31             {
32                 string url = urls[i-1];
33                 urls[i] = null;
34                 urls[i - 1] = null;
35                 Session["prevURL"] = urls;
36                 return url;
37             }
38         }
39         throw new Exception("");
40     }

    最终的代码费了我不少心思,为了使session保持小巧,我用了string数组,而不是string list,为了支持两级返回,我将数组的长度设为3,这是有原因的。

  它们是这样的使用方式,假设有A\B\C 3个页面,

  A可以跳到B,B可以跳到C,C可以返回B,B可以返回A。

  那么在A页面,这是一个起点页面,调用SaveCurrURL传入TRUE参数,B和C页面的参数为FALSE,注意C页面也要调用,这属于一个瑕疵。

  在B和C的返回按钮中,不论他们是不是从A跳过来的,也不论他们处与第2个页面还是第3个页面,统统调用

  Response.Redirect(this.GetCurrURL ());

  最后,别忘了在if (!IsPostBack)中调用Save函数.

  以上便是我对“返回”功能的小小尝试,只能说支持一定的使用范围,有一定的简化作用和通用的处理方式。当然它没有经过严格的测试,也希望大牛们能提供更好的方案。

  修改了一下:

  有人提出服务器重定向不好,我也觉得,所以又改了一下,不用Button 用HyperLink,当然代码也要修改

1     protected void SaveCurrURL(bool first)
2     {
3         if (Session["prevURL"] == null)
4             Session["prevURL"] = new string[3];
5         string[] urls = (string[])Session["prevURL"];
6         if (first)
7         {
8             urls[0] = Request.Url.PathAndQuery;
9             urls[1] = null;
10             urls[2] = null;
11         }
12         else13         {
14             if (urls[1] == null)
15                 urls[1] = Request.Url.PathAndQuery;
16             else if (urls[2] == null)
17                 urls[2] = Request.Url.PathAndQuery;
18             else
19                 urls[2] = null;
20         }
21         Session["prevURL"] = urls;
22     }
23     ///<summary>
24 /// 获取上次保存的URL
25 ///</summary>
26 ///<returns></returns>
27     protected string  GetCurrURL()
28     {
29         string[] urls = (string[])Session["prevURL"];
30         for (int i = 2; i >= 0; i--)
31         {
32             if (urls[i] != null)
33             {
34                 string url = urls[i-1];
35                 Session["prevURL"] = urls;
36                 return url;
37             }
38         }
39         throw new Exception("");
40     }

  URL保存和获取方法都稍微了改了一下。

  现在在有返回按钮的页面上这样用:

1       this.SaveCurrURL(false );
2       lbBack.NavigateUrl = this.GetCurrURL();

  这样就避免了服务器重定向。提高了性能。

本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/735603,如需转载请自行联系原作者

ASP.NET:返回按钮的解决方案摸索相关推荐

  1. 小程序webview跳转页面后没有返回按钮完美解决方案

    随着小程序越来越火爆,使一个产品如果只有公众号H5页面和APP显得不怎么完美,总感觉不搭上小程序这趟流量车,就会少了点什么,心里别扭地很.在此驱动下,我所在公司也决定赶紧上车. 但是,如果要按照小程序 ...

  2. Swift中隐藏某一页面的返回按钮

    最近在尝试用swift去编写一个小项目,由于用惯了oc,一时间无法适应.最基本的隐藏导航返回按钮都无法实现,在网上搜索半天,没有找到合适的方法,可能是我词不达意吧.最后终于在一篇文章中找到了解决方案. ...

  3. 小程序跳转H5页面没有返回按钮解决方案

    公司做了一个小程序,使用webview搭建:页面全部开发完毕后,领导说这个我们得嵌入某某H5活动页.一想,这不很简单.直接把h5页面地址给我不就好了吗.然而问题来了,发现下图的问题了吗???缺少返回按 ...

  4. ASP.NET返回上一页面的实现方法

    今天用ASP.NET做一个类似淘宝中的订单管理系统,遇到的问题:主界面通过一个超链接跳转到子界面后,试了好长时间还是无法从子界面返回主界面. 解决方法: 程序的相关介绍 主界面:未发货订单列表(htt ...

  5. asp.net 返回上一页的实现方法小集

    其实要实现这个功能主要还是要用到javascript 方法一: 在asp.net的aspx里面的源代码中 <input type="button οnclick="javas ...

  6. 小程序监听android返回键,如何监听小程序返回按钮事件?

    写在前面 为了能及时的将自己踩到的前端坑(包括ionic,angular,react,ReactNative,小程序,APICloud)分享给大家,以后会逐渐将文章转移到微信公众号:前端e家(fron ...

  7. iOS 为自定义返回按钮的页面添加右滑返回

    2019独角兽企业重金招聘Python工程师标准>>> 苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationCo ...

  8. uniapp微信小程序左上角返回按钮的监听

    项目场景: uni-app 开发微信小程序,界面中点击左上角的返回按钮或者是系统自带的虚拟返回操作,返回前监听用户是否在页面内进行了相应操作,如果有则进行提示(提示用户是否确定要返回),如果没有则直接 ...

  9. android 点击返回按钮退回桌面的时候销毁了应用

    发现一个奇异的bug,可能是系统版本高android11的原因吧,当应用回退栈为0的时候,按返回按钮会退回桌面,正常来说只是让应用返回后台而已,但是在楼主手机却出现了应用被销毁的问题,随即找到了解决方 ...

  10. swiftUI 自定义返回按钮

    iphone 在iphone下,因为不存在侧边栏,自定义返回按钮较为简单. 隐藏页面的返回按钮.使用toolbar修饰符或使用ZStack即可. toolbar: @Environment(\.pre ...

最新文章

  1. Hibernate中get方法和load方法的区别
  2. 为什么 Java 线程没有 Running 状态?一下被问懵!
  3. MaxCompute大数据实践,电商数据仓库选择雪花还是星型模型?
  4. Python虚拟环境pyenv、venv(pyvenv)、virtualenv之间的区别,终于搞清楚了!
  5. Spring boot优点
  6. 90年代谁最强?乔丹不可撼动石佛上榜
  7. 心路历程(六)-一个人的后台
  8. 使用JDBC操作基于Oracle的CLOB,BLOB字段类型
  9. Java数据保留小数
  10. 单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)
  11. php登录注册脚本,PHP - 登录脚本
  12. 项目演化系列--分布式锁
  13. 变量和数据结构的赋初值
  14. docker+elasticsearch的安装
  15. 【图论】Spfa算法求最短路(长得像Dijkstra的,Bellman_Ford的优化算法)
  16. react.js 表单验证-登录框
  17. 鉴客 C# 抓取页面(带认证)
  18. 计算机中键盘可以共享吗,两个电脑怎么共用一个键盘
  19. Apex英雄下载慢的解决方法|Apex英雄离线包分享
  20. win7系统ie被篡改怎么解决

热门文章

  1. [LeetCode]Unique Binary Search Trees
  2. iOS:界面适配(二)--iPhone/iPad适配(关于xib)
  3. 增加ssh无密码信任连接的安全性
  4. [教程] 康盛创想 Windows (server 2003) 服务器部署标准 白丁简明版
  5. Codeforces1005E1 - Median on Segments (Permutations Edition)(中位数计数)
  6. vue使用element-ui的el-input监听不了回车事件解决
  7. 会声会影2022美颜功能介绍 教你玩转视频美颜
  8. 网易云上线新版容器服务,开放更多Kubernetes功能
  9. NO5 grep-head-tail命令
  10. BZOJ1222: [HNOI2001]产品加工(诡异背包dp)