近日我也遇见当保存的数据量过大时,页面会卡住不动,客户不明情况连点按钮重复提交。网上搜索了一下也没有找到很好的解决方案。常规的设置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 Sub5. 假如说我们有一个 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按钮自动变亮。客户端与服务器端代码互不影响。