aspnet webforms禁用提交按钮

时间:2013-09-26 09:30:03

标签: javascript asp.net webforms postback

我在Webforms中遇到一个小问题。我正在尝试禁用提交时的提交按钮,以防止双重帖子。 问题是,如果在回发期间禁用了提交按钮,则不会调用代码隐藏中的onclick方法。回发仍然发生,但按钮onclick方法不会被调用。 有办法解决这个问题吗?

这是一个小问题的演示:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="WebApplication2._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-2.0.3.min.js"></script>

    <script>
        function disableButton() {
            //$('#<%=btn.ClientID%>').attr('disabled', 'diabled');
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Literal runat="server" ID="ltrDate" />
        <asp:Button runat="server" ID="btn" OnClientClick="disableButton();" Text="Hit me!" OnClick="Unnamed_Click" />
    </div>
    </form>
</body>
</html>

代码隐藏:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Unnamed_Click(object sender, EventArgs e)
        {
            Thread.Sleep(1000);
            ltrDate.Text = DateTime.Now.ToString();
        }
    }
}

如果运行此代码,它可以正常工作,但如果从javascript方法中删除//,则不再调用按钮onclick方法。 (回发仍然很好)

/马丁

更新: 这似乎是个老问题。

  

我从来没有这样做,因为当客户端禁用该按钮时,其信息不再发布回服务器,因此其服务器端点击事件不会触发。我怀疑这是你所看到的行为。   如果你确实设法使这项工作,我很想知道如何。   伊恩奥尔森    2004年6月9日星期三

2 个答案:

答案 0 :(得分:3)

更简单的解决方案:

<asp:Button ID="btnFind" runat="server" Text="Find"
    OnClientClick="if(this.alreadClicked == true) {this.disabled = true;
    this.value = 'Wait...';} else {this.alreadClicked = true;}" EnableViewState=false
</asp:Button>

您仍然禁用该按钮并向用户提供反馈&#34;等待...&#34;,但必须使用EnableViewState = false,以便在页面刷新时按钮重置为原始状态

答案 1 :(得分:2)

好的..我找到了答案:) 诀窍是使用Page.GetPostBackEventReference(btn)。该方法将插入对dopostback的调用,并且将触发正确的事件。 简单的解决方案是在禁用按钮的javascript行之后插入该行。然后它会工作,但如果你有客户端验证,那将无法正常工作。 (或者,它会起作用,但如果用户忘记输入所需信息,则会禁用提交按钮。)

以下是我编辑的原始问题的演示,以使用客户端验证,以及在回发时取消提交按钮:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="WebApplication2._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-2.0.3.min.js"></script>

    <script>
        $(function () {
            if (typeof ValidatorUpdateDisplay != 'undefined') {
                var originalValidatorUpdateDisplay = ValidatorUpdateDisplay;

                ValidatorUpdateDisplay = function (val) {
                    originalValidatorUpdateDisplay(val);

                    //Bind();
                    if (val.isvalid) {
                        $('#<%=btn.ClientID%>').attr('disabled', 'disabled');
                        <%=Page.GetPostBackEventReference(btn)%>
                    }
                }
            }
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager runat="server" />
    <div>
        <asp:TextBox runat="server" ID="txtFirstname" />
        <asp:RequiredFieldValidator runat="server" ControlToValidate="txtFirstname" Display="Dynamic" EnableClientScript="true" ErrorMessage="Please enter your firstname" />
        <br />
        <asp:Literal runat="server" ID="ltrDate" />
        <br />
        <asp:Button runat="server" ID="btn" Text="Hit me!" OnClick="Unnamed_Click" />
    </div>
    </form>
</body>
</html>

代码隐藏:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Unnamed_Click(object sender, EventArgs e)
        {
            Thread.Sleep(1000);
            ltrDate.Text = DateTime.Now.ToString();
        }
    }
}