惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
CERT Recently Published Vulnerability Notes
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
V
Vulnerabilities – Threatpost
T
Tenable Blog
P
Proofpoint News Feed
C
Check Point Blog
T
The Exploit Database - CXSecurity.com
F
Full Disclosure
P
Privacy & Cybersecurity Law Blog
美团技术团队
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
量子位
AI
AI
Spread Privacy
Spread Privacy
Help Net Security
Help Net Security
Know Your Adversary
Know Your Adversary
IT之家
IT之家
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Proofpoint News Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
LangChain Blog
I
Intezer
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
月光博客
月光博客
Recorded Future
Recorded Future
O
OpenAI News
WordPress大学
WordPress大学
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Y
Y Combinator Blog
Engineering at Meta
Engineering at Meta
S
Security @ Cisco Blogs
Recent Announcements
Recent Announcements
P
Privacy International News Feed
NISL@THU
NISL@THU
MongoDB | Blog
MongoDB | Blog
W
WeLiveSecurity
B
Blog RSS Feed
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
Cyberwarzone
Cyberwarzone
H
Hacker News: Front Page

博客园 - 王国营的博客

asp.net Handler中的IsReusable属性及在Handler中使用Session 一道面试题 多层循环的递归实现 约瑟夫环问题 不通过第三个变量实现两个整型变量的交换 将PHP文件生成静态文件源码 PHP Warning: date(): It is not safe to rely on the system's timezone settings EcShop 如何制作一张windows sp3启动安装盘iso? win7下xp mode IP在同一网段实现网络共享 sql server 2005附加数据库错误 无法打开物理文件 解决114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节 菜鸟学PHP之Smarty入门(组图) 弹出一次“设为主页”和“加入收藏”代码 EMS SQL Manager中文显示乱码的解决方法 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 CSS和JS链接地址中带的问号是做什么的 IIS7/IIS7.5下轻松配置PHP利器(微软PHP Manager for IIS 7) iframe异步加载技术及性能 新开网址导航网站,欢迎各位朋友捧场
关于Asp.Net中避免用户连续多次点击按钮,重复提交表单的处理
王国营的博客 · 2013-12-03 · via 博客园 - 王国营的博客

Web页面中经常碰到这类问题,就是客户端多次点击一个按钮或者链接,导致程序出现不可预知的麻烦.

客户就是上帝,他们也不是有意要给你的系统造成破坏,这么做的原因很大一部分是因为网络慢,点击一个操作之后,系统响应慢,于是点击多次.如果我们遇到这种情况,

也许是一样的操作方法,所以解决问题才是王道.

废话不多说,直接切入正题.

方法一:在客户端制作一个遮罩层.

即用js和css制作一个纯白色或者黑色的遮罩的div,当客户端点击按钮时,弹出这个div并覆盖在当前用户界面之上,

这样遮罩层下面的内容被屏蔽,用户就无法进行鼠标的多次点击操作.

优点:一个好的遮罩层具有很美观的UI感受,并且相对降低一点用户等待服务器响应的枯燥度.

缺点:遮罩下面的内容,如果用键盘操作,比如Enter键,还是可以操作的哦.(亲,这也是后来测试中才发现的,也许还有更好的遮罩层的代码,能够做到这些吧,我是没有用过).

遮罩层代码不再给出,可以在网上搜索使用.

方法二:用js代码判断重复提交,给出提示并拒绝提交至服务器.

前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<script type="text/javascript">
    //记录是否重复提交表单数据
    var repeatFlag = false;
    function CheckRepeatClick() {
        if (repeatFlag == false) {
            repeatFlag = true;
            return true;
        }
        else {
            alert("数据处理中,请稍候...");
            return false
        }
    }
</script>
<body>
    <form id="form1" runat="server">
    <div>
         这只是个测试网页
        <asp:Button ID="btnOK" runat="server" OnClick="btnOK_Click" Text="OK" OnClientClick="return CheckRepeatClick();"/>
<asp:LinkButton ID="lkbtnOK" runat="server" onclick="lkbtnOK_Click" OnClientClick="return CheckRepeatClick();" >测试LinkButton按钮</asp:LinkButton>
    </div>     </form> </body> </html>
后台代码:
        protected void btnOK_Click(object sender, EventArgs e)         {        
           System.Threading.Thread.Sleep(5000); //这里只是为了模拟后台相应慢的一个动作,替换成你自己的处理逻辑就OK了
        }

效果:当单击OK按钮后,提交请求至服务器,再次单击按钮,则弹出消息"数据处理中,请稍候..."。
对于LinkButton按钮的测试也是同样道理.
代码很简单,不过多说明。
优点:方法一中的缺点在这里得到了弥补。
缺点:方法一的优点这里没有了。
所以,将方法一和方法二同时使用,则相对完美一些啦,哈哈,我就是这么使用的。
方法三:单击按钮后,用js将按钮置为不可用状态,避免用户多次单击.
前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" EnableEventValidation="false" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<script type="text/javascript">
    //记录是否重复提交表单数据
    var repeatFlag = false;
    function CheckRepeatClick() {
        if (repeatFlag == false) {
            repeatFlag = true;
            return true;
        }
        else {
            alert("数据处理中,请稍候...");
            return false
        }
    }
</script>
<body>
    <form id="form1" runat="server">
    <div>
         这只是个测试网页
        <asp:Button ID="btnOK" runat="server" OnClick="btnOK_Click" Text="OK" />
        <asp:LinkButton ID="lkbtnOK" runat="server" onclick="lkbtnOK_Click" >测试LinkButton按钮</asp:LinkButton>
    </div>
    </form>
</body>
</html>
后台代码:
        protected void Page_Load(object sender, EventArgs e)
        {
            this.btnOK.Attributes.Add(" onclick ", ClientScript.GetPostBackEventReference
                (btnOK, " Click ") + " ;this.disabled=true; this.value='提交中...'; ");
 
            this.lkbtnOK.Attributes.Add(" onclick ", ClientScript.GetPostBackEventReference
                 (lkbtnOK, " Click ") + " ;this.disabled=true; ");
        }
 
        protected void btnOK_Click(object sender, EventArgs e)
        {
            System.Threading.Thread.Sleep(5000); //这里只是为了模拟后台相应慢的一个动作,替换成你自己的处理逻辑就OK了
        }
 
        protected void lkbtnOK_Click(object sender, EventArgs e)
        {
            System.Threading.Thread.Sleep(5000);
        }
效果:当单击按钮OK后,按钮本身更改为灰色不可用,并更改文本为"提交中...",这时候再次单击按钮,无法向服务器发送请求,从而屏蔽了重复提交,
当服务器响应第一次请求完毕后,按钮恢复为可用状态和自己的文本。(对于LinkButton呢,我想说的是,一样可以变成灰色,但是它是可用的,再次
单击,仍然会向服务器发送请求)
优点:直接变成灰色不可用,比起再次单击一下然后给你个提示信息,要友好一些吧。
缺点:对于LinkButton该方法不凑效。
因为在项目中还要使用较多的LinkButton,所以果断放弃了该方法。
因为LinkButton生成的客户端页面中,是<a>标签,尝试使用diplay等进行修饰,都没有成功。如果有哪位大大有好的方法,不妨告知。
注意:前台页面的Page中要加上这句话 EnableEventValidation="false" 原因你懂得