APP NEWS
ASP.NET 如何避免页面重新整理时重复送出
有些使用者的行为真是令人猜不透…,开网页有事没事就来给你Refresh一下,这个动作看似无害,但是在刚执行过Submit的情况下,Refresh网页会造成重复执行,这也是为什么在各大购物网站的交易付款动作,都会提示「不要关闭网页或重新整理避免造成交易失败

有些使用者的行为真是令人猜不透…,开网页有事没事就来给你 Refresh 一下,这个动作看似无害,但是在刚执行过 Submit 的情况下,Refresh 网页会造成重复执行,这也是为什么在各大购物网站的交易付款动作,都会提示「不要关闭网页或重新整理避免造成交易失败或重复交易」这一类的讯息,但根据经验,就算在网页上提出警告了,仍有为数不少的使用者依然会 Refresh 网页。
注意,别以为只有 ASP.NET 才有这种问题,这问题普遍存在于网页程式,不管你用何种平台、语言开发,这肇因于浏览器会自行 Cache 使用者的浏览行为 (包含资料),测试过 IE、FireFox、chrome 都一样,猜想是因为这样才能有上一页、下一页的歷程纪录,至于更进一步的探讨,小的力有未逮就不再深究 (欢迎瞭解的前辈高人指点一下迷津,说说缘由)…既然浏览器塬始设计如此,而我们可能永远都猜不透使用者爱怎么操作,那就针对 ASP.NET 的开发来看看有甚么方式可以解决这样的问题。
不知道有没有人跟我一样,马上想到的是:重新导向,也就是在执行某一工作成功之后,执行 Response.Redirect 方法重导到结果页面,这是最典型的作法,不过这比较适用在动作连贯的多重网页表单,例如:购物车,在完成结帐后就可以导到订购成功的讯息页面,反正前面也从第一步、第二步…到结帐画面了,再多导一次已经差别不大。可惜多重网页表单毕竟是少数,大部分网页程式现在几乎都要求非同步更新 (AJAX),最好在同一画面完成所有动作,即便今天不要求非同步更新,每个作业完成之后都导到另一个网页,也不甚理想,所以这种作法并不完美,除了多维护一个网页的麻烦不说,事实上使用者若先回到上一页再重新整理,一样可能会造成重复执行…。
那在任何异动前,先检查是否有相同资料存在呢?换句话说是在资料库端检查,应该可行,不过…过程似乎稍嫌繁琐,要针对每一个作业内容个别去撰写比对是否有相同资料的逻辑,光想就觉得累了…,况且有时候确实是可以允许相同资料存在,比如说线上客服的留言版,使用者不耐久候时,会再留言一次,内容可能跟前次一模一样,这跟重刷页面造成的资料重复是不可相提并论的,这样看来在资料库端排除相同资料也不是很好的作法…
关键点在于怎么分辨出使用者正在重刷页面,进一步地,有没有一劳永逸的做法,让我们可以检查某一属性就能判断是不是重刷页面所回传,来避免重复送出动作?转念一想:太阳底下无新事,上网搜寻了一下,国外有几篇文章、讨论串针对这问题提出了几个解法 (事实证明前述两种作法也是有人建议),其中我觉得最值得一看的是底下两篇:
Build Your ASP.NET Pages on a Richer Bedrock Preventing Duplicate Record Insertion on Page Refresh
参考上列两篇文章的内容,得到最后的答案是:我们可以继承 ASP.NET 的 Page 类别,自行扩充所需的功能!作法如下:
1、继承 System.Web.UI.Page,自订一个 BasePage 类别。
以下为引用的内容:
- using System;
- ///
- /// BasePage 的摘要描述
- ///
- public class BasePage : System.Web.UI.Page
- {
- public BasePage() { }
- }
2、在 BasePage 类别底下撰写 SetActionStamp 方法,目的是在 Session 存放一个系统时间戳记。
以下为引用的内容:
- ///
- /// 設置戳記
- ///
- private void SetActionStamp()
- {
- Session[&actionStamp&] = Server.UrlEncode(DateTime.Now.ToString());
- }
3、处理 PreRender 事件,在网页初次载入时设置戳记,且每次载入执行时会把该戳记存放到 HiddenField 里。
以下为引用的内容:
- public BasePage() { this.PreRender += new EventHandler(Page_PreRender); }
- void Page_PreRender(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- SetActionStamp();
- }
- ClientScript.RegisterHiddenField(&actionStamp&, Session[&actionStamp&].ToString());
- }
4、自订 IsRefresh 属性,藉由判断 HiddenField 存放的戳记是否等于 Session 裡存放的值,就可以得知网页是否经由重新整理动作回传。
以下为引用的内容:
- 关键词标签:ASP.NET
相关阅读 ASP.NET创建XML Web服务全接触 如何提高ASP.NET页面载入速度的方法 .net导出海量数据到execl文件 ASP.NET 2.0程序安全的基础知识 ASP.NET中MD5与SHA1加密的几种方法 在.net开发中几个重要的认识误区
文章评论查看所有0条评论>>
发表评论提交评论
热门文章
相关下载
在ASP.NET MVC中实现大文件异步上传
在.NET环境下为网站增加IP过滤功能
诛仙3飞升任务怎么做-诛仙3飞升任务流程最新2022
ASP.NET 如何避免页面重新整理时重复送出
钟离圣遗物推荐-原神钟离圣遗物词条
人气排行 诛仙3飞升任务怎么做-诛仙3飞升任务流程最新2022 asp.net表单提交方法GETPOST 在ASP.NET中如何判断用户IE浏览器的版本 Asp.net中messagebox的实现方法 Asp.net中的web.config配置 在ASP.NET MVC中实现大文件异步上传 asp.net获取URL和IP地址 FileUpload上传多文件出现错误的解决方法 ASP.NET Web.config配置详解 Asp.net常用的51个代码(非常实用) ASP.NET打开word文档出错的解决办法 让你的.NET程序兼容不同版本的Dll文件
关于我们| 下载帮助| 版权声明| 合作伙伴| 友情连接| 联系我们| 网站地图Copyright © 2007-2026 IT猫扑网 All Rights Reserved. 豫ICP备2026021191号-1 豫公网安备42010145200009号
{ "@context": "https://zhanzhang.baidu.com/contexts/cambrian.jsonld", "@id": "https://www.itmop.com/article/3726.html", "appid": "否", "title": "ASP.NET 如何避免页面重新整理时重复送出-IT猫扑网", "images": ["https://img.itmop.com/upload/allimg/091109/1Z54W230-0-lp.png"], "description": "{$Excerpt}", "pubDate": "2015-06-28T00:00:00", "upDate": "2015-06-28T00:00:00", "data": { "WebPage": { "pcUrl": "https://www.itmop.com/article/3726.html", "wapUrl": "https://m.itmop.com/article/3726.html", "fromSrc": "IT猫扑网" } } }






