我在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日星期三
答案 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();
}
}
}