"返回"按钮的解决方案摸索

做过网站或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 /// 获取上次保存的URL
23 ///</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 else
13 {
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();

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分析一下这个json {&quot;name&quot;:&quot;12312&quot;,&quot;project_id&quot;:&quot;87156&quot;,&quot;project_name&quot;:&quot;上上下下左左右右baba与聚法科技(长春)有限公司与公司、证券、保险、票据等有关的民事纠纷&quot;,&quot;client&quot;:&quot;[{&quot;type&quot;:&quot;自然人&quot;,&quot;customer_id&quot;:&quot;80236&quot;,&quot;customer_name&quot;:&quot;上上下下左左右右baba&quot;}]&quot;,&quot;sign_date&quot;:&quot;2023-06-06&quot;,&quot;expire_date&quot;:&quot;2023-06-21&quot;,&quot;subject_amount&quot;:&quot;123&quot;,&quot;contract_amount&quot;:&quot;123&quot;,&quot;charge_method&quot;:&quot;一次性,分阶段,风险,计时&quot;,&quot;equity_amount&quot;:&quot;13811&quot;,&quot;amount_info&quot;:&quot;[{&quot;type&quot;:&quot;一次性&quot;,&quot;pay_date&quot;:&quot;2023-07-03&quot;,&quot;charge_amount&quot;:&quot;12&quot;},{&quot;type&quot;:&quot;分阶段&quot;,&quot;pay_date&quot;:&quot;2023-06-13&quot;,&quot;charge_amount&quot;:&quot;123&quot;,&quot;is_satisfy&quot;:&quot;是&quot;,&quot;pay_condition&quot;:&quot;12312&quot;},{&quot;type&quot;:&quot;风险&quot;,&quot;pay_date&quot;:&quot;&quot;,&quot;charge_amount&quot;:&quot;&quot;,&quot;is_satisfy&quot;:&quot;是&quot;,&quot;pay_condition&quot;:&quot;123&quot;,&quot;basic_amount&quot;:&quot;123&quot;,&quot;risk_amount&quot;:&quot;12&quot;,&quot;object_amount&quot;:&quot;123123&quot;,&quot;object&quot;:&quot;赔偿金&quot;,&quot;risk_prop&quot;:&quot;13213&quot;,&quot;member&quot;:&quot;&quot;,&quot;rate&quot;:&quot;&quot;,&quot;hours&quot;:&quot;&quot;},{&quot;type&quot;:&quot;计时&quot;,&quot;member_id&quot;:&quot;392159&quot;,&quot;member&quot;:&quot;曹野&quot;,&quot;rate&quot;:&quot;11&quot;,&quot;hours&quot;:&quot;1231&quot;}]&quot;,&quot;seal_person&quot;:&quot;123&quot;,&quot;seal_type&quot;:&quot;律所公章,法人名章,财务章&quot;,&quot;seal_num&quot;:&quot;123&quot;,&quot;file_path&quot;:&quot;[{&quot;title&quot;:&quot;导入错误数据 (15).xls&quot;,&quot;path&quot;:&quot;382585/1686381522542/导入错误数据 (15).xls&quot;,&quot;size&quot;:&quot;91136&quot;},{&quot;title&quot;:&quot;3.txt&quot;,&quot;path&quot;:&quot;382585/1686561731102/3.txt&quot;,&quot;size&quot;:44078}]&quot;,&quot;remark&quot;:&quot;123123&quot;} 并使用php转换成字符串
06-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值