3

我在 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 日,星期三

4

2 回答 2

4

一个更简单的解决方案:

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

无论如何,您都禁用该按钮并向用户提供反馈“等待...”,但必须使用 EnableViewState=false 以便在页面刷新时按钮重置为原始状态。

于 2015-01-08T19:38:35.897 回答
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();
        }
    }
}
于 2013-09-26T10:03:20.707 回答