我们可以继承 ASP.NET 的 Page 类别,自行扩充所需的功能!作法如下:
1、继承 System.Web.UI.Page,自订一个 BasePage 类别。
以下为引用的内容:
|
2、在 BasePage 类别底下撰写 SetActionStamp 方法,目的是在 Session 存放一个系统时间戳记。
以下为引用的内容:
|
3、处理 PreRender 事件,在网页初次载入时设置戳记,且每次载入执行时会把该戳记存放到 HiddenField 里。
以下为引用的内容:
|
4、自订 IsRefresh 属性,藉由判断 HiddenField 存放的戳记是否等于 Session 裡存放的值,就可以得知网页是否经由重新整理动作回传。
以下为引用的内容:
|
之后撰写网页程序时,只要衍生自 BasePage 就可以取得 IsRefresh 属性值,可以用来判断网页是否被重新整理,避免重复执行之前的动作:
至于概念是这样:网页初次载入时我们在 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 属性,例如:
设定完成之后,往后新加入的 Web Form 就会改继承自 BasePage。