Javascript aspnet webforms在提交时禁用按钮

Javascript aspnet webforms在提交时禁用按钮,javascript,asp.net,webforms,postback,Javascript,Asp.net,Webforms,Postback,我在Webforms中遇到了一个小问题。我试图在提交时禁用提交按钮,以防止重复发布。 问题是,如果在回发过程中禁用了submit按钮,则不会调用codebehind中的onclick方法。回发仍会发生,但不会调用buttons onclick方法。 有没有办法绕过这个问题 下面是问题的一个小演示: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="WebApplicati

我在Webforms中遇到了一个小问题。我试图在提交时禁用提交按钮,以防止重复发布。 问题是,如果在回发过程中禁用了submit按钮,则不会调用codebehind中的onclick方法。回发仍会发生,但不会调用buttons 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>
如果运行此代码,它工作正常,但是如果从javascript方法中删除//,则不再调用buttons onclick方法。(回发仍然可以正常进行)

/马丁

更新: 这似乎是个老问题

我从来没有这样做过,因为当按钮在客户端被禁用时,它的信息将不再发布回服务器,因此它的服务器端单击事件不会触发。我怀疑这就是你看到的行为。 如果你能做到这一点,我很想知道怎么做。 伊恩·奥尔森 二○○四年六月九日(星期三)

好的。。我找到了答案:) 诀窍是使用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>

一个更简单的解决方案:

<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>

您的回答让我在客户端验证函数中找到了一部分:)在禁用了我最后调用的按钮之后:ClientScript.GetPostBackEventReference(btnSubmit,”;(显然是新的方式吗?)正在运行,但没有破坏现有的验证。
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();
        }
    }
}
<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>