ASP.NET避免页面重新整理时重复发送...

 

我们可以继承 ASP.NET 的 Page 类别,自行扩充所需的功能!作法如下:

1、继承 System.Web.UI.Page,自订一个 BasePage 类别。

以下为引用的内容:
  1. using  System;   
  2.   
  3. /// <summary>   
  4. /// BasePage 的摘要描述   
  5. /// </summary>   
  6. public   class  BasePage : System.Web.UI.Page   
  7. {   
  8.      public  BasePage() { }   
  9. }  

2、在 BasePage 类别底下撰写 SetActionStamp 方法,目的是在 Session 存放一个系统时间戳记。

以下为引用的内容:
  1. /// <summary>   
  2. /// 設置戳記   
  3. /// </summary>   
  4. private   void  SetActionStamp()   
  5. {   
  6.     Session[ "actionStamp" ] = Server.UrlEncode(DateTime.Now.ToString());   
  7. }  

3、处理 PreRender 事件,在网页初次载入时设置戳记,且每次载入执行时会把该戳记存放到 HiddenField 里。

以下为引用的内容:
  1. public  BasePage() {  this .PreRender +=  new  EventHandler(Page_PreRender); }   
  2.   
  3. void  Page_PreRender( object  sender, EventArgs e)   
  4. {   
  5.      if  (!IsPostBack)   
  6.     {   
  7.         SetActionStamp();   
  8.     }   
  9.   
  10.     ClientScript.RegisterHiddenField( "actionStamp" , Session[ "actionStamp" ].ToString());   
  11. }  

4、自订 IsRefresh 属性,藉由判断 HiddenField 存放的戳记是否等于 Session 裡存放的值,就可以得知网页是否经由重新整理动作回传。

以下为引用的内容:
  1. /// <summary>   
  2. /// 取得值,指出网页是否经由重新整理动作回传 (PostBack)   
  3. /// </summary>   
  4. protected   bool  IsRefresh   
  5. {   
  6.      get   
  7.     {   
  8.          if  HttpContext.Current.Request[ "actionStamp" ]  as   string  == Session[ "actionStamp" ]  as   string )   
  9.         {   
  10.             SetActionStamp();   
  11.              return   false ;   
  12.         }   
  13.   
  14.          return   true ;   
  15.     }   
  16. }  

之后撰写网页程序时,只要衍生自 BasePage 就可以取得 IsRefresh 属性值,可以用来判断网页是否被重新整理,避免重复执行之前的动作:

BasePage

至于概念是这样:网页初次载入时我们在 Session 记录时间戳记,Copy 一份到 HiddenField 存放起来,在页面反覆执行时该戳记始终是初次设置的值,直到某一项动作我们希望可以辨别是否经由重新整理所送出,所以对 IsRefresh 属性加以判断 ,初次送出时当然会回传 false,作业可以顺利执行,连带只更新 Session 裡的时间戳记,这时已不同 HiddenField 裡的值。有趣的事情来了,Refresh 时把前次动作再送出一次,但因为浏览器会 Cache 状态,这时 HiddenField 裡的时间戳记依然是较旧的值,不同于 Session 所持有的,检查 IsRefresh 属性值是 true,为了避免重复执行就可以把动作挡下来。

目前为止,本文就标题所提的问题提出解法并简单说明了概念,但前面所提供的那两篇参考文章其实有详细的阐述,想了解的人建议一定要去看看,特别是第一篇由大师 Dino Esposito(介紹個人部落格 ) 所写的文章。

最后说一个 Dino 大师的文章有提到的小技巧,既然我们扩充了一个有侦测页面重新整理功能的 BasePage 类别,那要怎么让之后新加入的 Web Form 预设都是由 BasePage 衍生而来?可以打开 web.config 档裡 <system.web》 底下的 <pages》 设定 pageBaseType 属性,例如:

pageBaseType

设定完成之后,往后新加入的 Web Form 就会改继承自 BasePage。

本文转自:http://www.alixixi.com/program/a/2009111058978.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值