Asp.net页面防止重复提交

来源:互联网 发布:希尔排序算法动画演示 编辑:程序博客网 时间:2024/05/16 19:05

 Asp.net有一个很讨厌的特性,点击一个Button后,如果还在原来的页面的话,按F5刷新的时候会重新执行刚才的那个按钮事件,这个问题比较实用并简单的解决方法就是执行完按钮事件以后重新打开一次页面
另外一个会出现重复提交的情况是:网速比较慢的时候,点击Button可能要等个好几秒才会执行完,这时候有的用户就容易习惯性地再点几次按键,就造成了多次提交,特别是添加新信息的时候,程序中无法判断哪条信息是正常的,哪条是误点击提交的,于是就会全部添加到数据库里面。这种错误信息在开发的时候很难检查出来,因为本地运行程序都比较快,传到服务器上时才会出现这样的问题。有人说在客户端JS代码中把Button禁用掉,如下所示:


后台的Page_Load中添加
btnSend.Attributes["onclick"] = "return checkForm();";

貌似非常完美的解决方法,但经过测试,这种方法根本行不通,这个时候客户的请求并没有提交,在客户端JS代码中把按钮给禁用了,于是客户的请求就永远也提交不了了。

今天中午调试程序,又碰到这个问题,不经意间想起了如下解决方法,不妨一试,原理如下:
页面中放一个隐藏的变量来标识是否已经进行过提交,点击Button的时候根据此变量的值来判断是否是第一次点击,是的话,改变变量的值,并允许提交请求,否则的话提示用户不能重复提交,并返回False。
代码如下:
页面中添加一个HiddenField,ID为"submitted",然后添加如下JS代码:

       function checkForm()
        {
            if(document.getElementById("submitted").value == "submit")
            {
                alert("您的请求正在处理中,请不要重复提交");
                return false;
            }
            document.getElementById("submitted").value = "submit";
            return true;
        } 
后台Page_Load中添加:
btnSend.Attributes["onclick"] = "return checkForm();";
简单测试,OK

下面是在网上看到的两个方法,标记一下,有空试试
解决方法一:
 .Framework2.0中才有的button属性:
 解决重复提交:OnClientClick="this.disabled=true;this.form.submit();" UseSubmitBehavior="False"

解决方法二:
 this.btnSubmit.Attributes["onclick"] = this.GetPostBackEventReference(this.btnSubmit) + ";this.disabled=true;"; //防止重复提交