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" 原因你懂得

关于Asp.Net中避免用户连续多次点击按钮,重复提交表单的处理的更多相关文章

  1. PHP防止用户重复提交表单

    我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦. 那么如何规避 ...

  2. jsp中普通按钮如何提交表单

    jsp中普通按钮如何提交表单方法1: <form action = "提交的地址">         <input type="submit" ...

  3. struts2中token防止重复提交表单

    struts2中token防止重复提交表单 >>>>>>>>>>>>>>>>>>>&g ...

  4. php中限制ip段访问、禁止ip提交表单的代码

    在需要禁止访问或提交表单的页面添加下面的代码进行判断就可以了. 注意:下边只是一个PHP限制IP的实例代码,如果您打算应用到CMS中,请自行修改. <?php /加IP访问限制 if(geten ...

  5. ASP.NET 给作为隐藏域的TextBox赋值之后提交表单,无响应?

    操作步骤: 给页面隐藏TextBox赋值,然后触发ASP.NET change事件,调用ASP.NET后台方法,调用后执行客户端脚本this.RegisterClientScriptBlock(Dat ...

  6. yii防止延迟用户多次点击按钮重复提交数据

    是不是被用户的行为所困扰? 一. 一个表单用户点击提交按钮了N次,这也导致了数据提交了N次. 为了此受到了测试的欺辱,受到了老板的批评? 不用怕,它就是来拯救你的. 第一步:打开命令行,敲入 comp ...

  7. Ajax在jQuery中的应用 (4)向jsp提交表单数据

    ajax技术带给我们的是良好的用户体验,同时,使用jquery可以简化开发,提高工作效率. 下面就介绍一下大致的开发步骤. 工具/原料 本文中使用的是 jquery-1.3.2.min.js 方法/步 ...

  8. 重新理解了重定向,利用重定向可以防止用户重复提交表单(兼谈springmvc重定向操作)

    自己用springmvc框架有一段时间了,但是都还一直分不清楚什么时候应该用转发,什么时候应该用重定向.可能用转发的情形太多了,以致于自己都忘记了还有重定向. 当用户提交post请求之后,刷新页面就会 ...

  9. 防止asp.net连续点击按钮重复提交

    1.在Page_Load中添加如下代码: protected void Page_Load(object sender, EventArgs e) { this.btnEdit.Attributes[ ...

随机推荐

  1. Selenium 设置管理cookie,超时时间

    可以通过option设置管理cookie,超时时间 一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,储存在内存.而session机制采用的是在服 ...

  2. Request.ServerVariables详细说明

    客户端ip: Request.ServerVariables.Get("Remote_Addr").ToString();  客户端主机名: Request.ServerVaria ...

  3. 在PHP网页中,如何把$_session["yyy"]赋值到一个文本框中?

    echo '<input type="text" id="text1" name="text1" value="'.$_SE ...

  4. poj 1192最优连通子集(简单树形dp)

    题目链接:http://poj.org/problem?id=1192 #include<cstdio> #include<cstring> #include<iostr ...

  5. hdoj 1342 Lotto【dfs】

    Lotto Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  6. .Net设计模式_单列模式

    理解 博友的经典说法:很多人排队去厕所蹲坑一样,每一次只能让一个人去蹲坑,这是一种通俗的理解. 理论上的理解则为,我们需要写一个类,这个类的作用就是控制,从而保证在整个应用程序的生命周期中,在任何时刻 ...

  7. 400. Nth Digit

    这个EASY难度的题怎么感觉比H的还难,昨天没做出来,今天才做出来.. 呃啊..我生 气 啦.. 直接看的答案,耻辱. 1 digit: 1~9 总共1×9个 2 digits: 10~99 总共2× ...

  8. hdu 1242 dfs/bfs

    Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...

  9. 转 jquery 学习笔记

    jQ通过选择器选择元素,选择器的语法和css类似$(css选择器语法) 参数可以是id.class.tag等等通过如上选择就可以获得一个元素 jQuery名字冲突 解决方法: var jq=jQuer ...

  10. grunt个人理解

    最近在学习grunt的内容,也希望能将grunt使用在新的项目中,本文是对grunt的相关概念的个人理解,仅供与道友们交流和学习,如有疑义,欢迎道友们指点. 首先,grunt是基于nodejs的,那就 ...