当前位置:编程学习 > C#/ASP.NET >>

关于阻止页面按钮多次提交的解决办法

     近日我也遇见当保存的数据量过大时,页面会卡住不动,客户不明情况连点按钮重复提交。网上搜索了一下也没有找到很好的解决方案。常规的设置Enabled属性在未拿到新页面前是无效的,而在客户端单击事件里填写disabled="true";时后台事件处理器代码将不再执行,弹出div遮挡什么的都不是最理想的状态。最理想的还是使按钮变灰,经过一天的琢磨,方法已经找到,如有不足,请大家指出 :


解决思路:使按钮变灰,阻止二次操作。直到页面回发。

实现原理:用一个普通客户端脚本可控制的html按钮牵引要执行的button触发其事件

解决步骤:

1. 在页面上增加一个新的 html 标准button,注意是普通button,不是submit!并标记为runat=server 代码如下:
 <input id="btnCli" type="button" runat="server" value="测试"/> 

2. <head></head>标签中新增js代码,用于单击时使按钮变灰:
<script type="text/javascript">
       function test(){
       document.formControl.btnCli.disabled="true";
 }
</script>

3. 给刚添加的客户端button按钮增加两个事件:onclick="test();" onserverclick="btnCli_ServerClick"

4. 切换到后台.vb 文件 增加 id为btnCli 的 button的点击事件的服务器端事件处理器,代码如下
Protected Sub btnCli_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs)   
  
End Sub

5. 假如说我们有一个 id为 btnSave的服务器端按钮为保存数据等重要操作,即防止客户多次点击的要保护按钮。btnSave的服务器端事件处理器已经写好。那么,在以上btnCli 的服务器端点击事件里填写的代码很简单:
   Call btnSave_Click(Nothing, Nothing)

6.  到这里,功能代码已经全部实现。剩下的就是给该标准的html按钮增加CSS样式表,使之与页面相协调
7.   最后一步,将id为 btnCli的button移动至要保护的btnSave位置处,btnSave移动到一边,并隐藏。


测试结果:
为了模拟真实情景,我们在btnSave的事件处理器中增加5秒的线程休眠,当点击btnCli时 客户端js优先执行。按钮马上变灰,后台代码跳转至btnSave点击事件的事件处理器 Thread.Sleep(5000)处开始等待,5秒结束后,页面回发,拿到新页面,btnCli按钮自动变亮。客户端与服务器端代码互不影响。
--------------------编程问答-------------------- 支持楼主分享! --------------------编程问答-------------------- --------------------编程问答-------------------- 其实可以利用QQ超市里面的弹出进度条,来遮盖当前页面不允许操作,可能体验会好点 --------------------编程问答-------------------- 支持楼主分享
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,