一个彻底解决.Net刷新导致的重复提交的问题
在以前的项目中经常会遇到一个问题,在点击一个按钮,后台处理完之后返回页面,这时候如果用户刷新的话,刚才的动作就会被重复执行。
例如一个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,所以就不会再触发删除事件,大家觉得可行么?