一个彻底解决.Net刷新导致的重复提交的问题

xiaovsjia 2010-06-07 09:57:37
在以前的项目中经常会遇到一个问题,在点击一个按钮,后台处理完之后返回页面,这时候如果用户刷新的话,刚才的动作就会被重复执行。



例如一个gridview中有三行,每一行都有一个删除按钮,按下第三行的删除之后执行以下代码:
//删除
//重新绑定gridview
//JS等方式弹出对话框提示用户删除成功
OK。。。没问题。。。
但是。。。如果这时候用户刷新页面。。。。
刚才的删除事件居然再次执行???



在网上现有的解决方案有如下几种:
1、在后台处理完之后将页面重定向到本页面,例如Response.Redirect('当前页面')
这样虽然可以解决问题,但是如果该页面有查询参数的话,就会导致参数丢失以及页面完全重新加载。。抛弃。
2、在页面中加入一个按钮,用于绑定GridView,使用js拦截F5,然后点击那个按钮
保留了查询参数,无需完全重新加载,但是只能拦截到F5,直接点击浏览器上的刷新按钮时就死掉了。而且必须每个页面都加上一个按钮,很是麻烦。。
3、很麻烦的一种方法。。我至今都没理解。。。用令牌之类的。。。。



但是今天在研究.Net事件回传机制的时候,突然发现一种更为优秀的方法。。
大家可以先参考一下下文:
http://why100000.com/Htmls/tabAspNet137.htm


一个页面中有可能有多个按钮,那NET后台是如何知道是那个按钮触发的回发呢?如何知道接下来该触发那个事件呢?

看了上文的话,大家应该都有一定了解了。

之所以在处理完之后刷新会导致再次触发刚才的事件,是因为该表单中依旧保留了上一次的记录。

例如上面说的例子:

在点击删除处理好之后,按下刷新,调试之后发现,Net依旧接收到了ButtonDelete,所以依旧触发删除事件。。

那我们是不是可以这样假定,
//删除
//重新绑定gridview
将表单中的ButtonDelete去掉
//JS等方式弹出对话框提示用户删除成功

加入这一步骤之后,Net没接收到ButtonDelete,所以就不会再触发删除事件,大家觉得可行么?



...全文
626 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
苍鹫 2011-09-19
  • 打赏
  • 举报
回复
也希望这个问题能解决,一直关注中
sqzyst 2010-10-25
  • 打赏
  • 举报
回复
希望这 帖子 有个好结果 ,一直关注中。。。
xiaovsjia 2010-06-11
  • 打赏
  • 举报
回复
2010-06-11
依旧无解。。
xiaovsjia 2010-06-10
  • 打赏
  • 举报
回复
以前在处理的时候都是直接用js捕获F5操作,然后更改为点击一个隐藏起来的按钮,该按钮用于重新绑定GridView
但是,这样子的话就无法处理直接点击浏览器中的刷新的。。

后来,在看了上面的那篇文章之后,开始有新的想法。
不管.NET怎么强大。但是,最终都必须转化为HTML。
与服务器交与,用的大部分都是表单。。

但是既然是一个表单,.NET怎么知道用户是更改了Select导致的回发,还是点击Submit呢?

了解了这些之后,明白了底层的原理。。

原来还是一个隐藏文本框的作用
.NET在接收到这个隐藏文本框传过来的值,再来决定触发那个事件。。

也就是说,如果我们能将接收到的form表单中,将这一项更改的话
就可以实现点击Submit而触发Select Change事件。

good。。。。
但是。。。
怎么更改呢。。。。。。
xiaovsjia 2010-06-10
  • 打赏
  • 举报
回复
3楼的是针对一些单个功能的情况哦。。
如果是这样一种情况:
使用gridView之类的控件列出数据列表,然后加上一列删除功能。
这时候删除之后有两种做法。
1、重新绑定数据
2、重定向到本页面(会导致页面全部重新加载,并且,如果有分页之类的话,也会丢失掉页码之类的参数)

所以一般都是采用第一种方式,将gridView重新绑定
但是会遇到一个问题。
这时候如果刷新页面的话,会重复上一次的删除操作。
例如刚才是删除ID为10的记录 Delete(10)
那刷新之后依旧是提交Delete(10),从而导致提示删除失败。。。
只在此山中 2010-06-08
  • 打赏
  • 举报
回复
防止重复提交:

在每次处理请求(比如按钮的回发事件)后,都随机生成一个字符串,这个字符串分别存放在Session和响应页面中,在开始处理用户请求时,判断传上来的字符串和Session中的字符串是否匹配,如果是重复提交,客户端传上来的字符串就是个旧的,显然和Session中的字符串不同。
也可以自定义一个控件方便调用。
具体步骤如下:
1、在进入页面的时候,随机生成个字符串,这个保存到session并且写到页面的控件上。
2、在提交后,判断你的session中的字符串和提交上来的字符串是否相同,相同就进行处理;不相同说明是重复提交,不进行相关处理,写个alert提醒不能重复提交。
3、然后重复第1步。
jianshao810 2010-06-08
  • 打赏
  • 举报
回复
不太会。直接设置按钮不可用吧
xiaovsjia 2010-06-08
  • 打赏
  • 举报
回复
晕,没有人对这个感兴趣吗?
xiaovsjia 2010-06-07
  • 打赏
  • 举报
回复
现在遇到一个问题就是如何将 ButtonDelete 从表单中移除
测试管理与QualityCenter培训手册 1、测试流程管理、测试度量方法 按照尽早进行测试的原则,测试人员应该在需求阶段就介入,并贯穿软件开发的全过程。就测试过程本身而言,应该包含以s下几个阶段。  -测试需求的分析和确定。  -测试计划。  -测试设计。  -测试执行。  -测试记录和缺陷跟踪。  -回归测试。  -测试总结和报告。 一个好的测试管理工具应该能把以上几个阶段都管理起来。 测试人员每时每刻都在度量别人的工作成果,而测试人员的工作成果又由谁来度量呢?度量的标准和依据是什么呢?软件测试的度量是测试管理必须仔细思考的问题。缺乏尺度会让测试失去平衡,缺乏标准会让测试工作难以衡量。 2、如何搭建测试管理平台? 首要问题是流程的规范化。 (1) 测试进入和退出标准。 (2) 协作流程。 (3) 缺陷跟踪管理流程。 (4) 工具平台的引入。 目前主流测试管理平台与缺陷跟踪工具: 3、QC(Quality Center)介绍 QC标准测试管理流程 QC支持的应用服务器:Jboss、WebLogic、WebSphere QC支持的数据库:Oracle、SQLServer QC支持的操作系统:Windows、Linux、Solaris 支持群集: 服务器端硬件和数据库要求: Windows: Linux: Solaris: 客户端系统要求: 练习1:安装QC 详见《Mercury Quality Center 9.0 Installation Guide》 Win2003+SQLServerSp4+QC9.0安装示例 1、安装Windows Server 2003 Enterprise Edition、安装IIS邮件服务器 2、安装SQL Server 2000、打上补丁Sp4 安装好SQL Server 2000后注意启动SQLServer服务器 3、安装QC9.0 服务器名称也可以是IP地址 4、启动QC9.0 5、QC9.0安装问题解决 - JBOSS启动不了 原因:8080端口被其他应用程序占用。 用netstat查看谁占用了8080端口 netstat -ano 解决办法1:修改其他程序的端口使用 解决办法2:修改JBOSS的启动端口 JBOSS_HOME\server\default\deploy\jbossweb-tomcat55.sar\server.xml 6、修改IP地址后不能登录QC 解决办法: 在C:\Program Files\Mercury\Quality Center\jboss\server\default\deploy目录下找到10sabin.war 进入10sabin.war\WEB-INF,修改siteadmin.xml中的IP地址: 修改数据库中的数据: 修改后可以登陆 但是还需要修改以前Project的数据库连接属性 否则会提示错误 然后还要修改 C:\Program Files\Mercury\Quality Center\repository\qc中的dbcon.txt: qcsiteadmin_db@192.168.1.12.1433. 还有 C:\Program Files\Mercury\Quality Center\repository\qc\Default\QualityCenter_Demo_db中的dbid.xml 192.168.1.12 7、Mercury Tours 样例程序 启动:http://192.168.1.2:8080/mtours 注意安装JVM才能“View Calendar” 4、创建和定义测试需求、测试需求管理、跟踪 定义需求 1、查看需求 视图->需求树 2、添加需求 需求->新建需求 输入以下内容 3、添加子需求项 查看需求 ZooIn : CTRL + I ZooOut : CTRL + O 视图->编号 视图->需求网格 视图->筛选/排序->设置筛选器/排序 设置排序字段 设置过滤条件 修改需求 拷贝需求项Cruise Reservation 重命名需求项Cruise Reservation_Copy_1为Hotel Reservation 移动需求项

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧