按钮触发点击事件两次

15

看起来有时候(但并非总是),我的按钮点击事件会被触发两次。它似乎有时候发生,但不总是,这真的让我感到困惑。这是我的按钮:

<button id="btnSave" onserverclick="btnAddUser_Click" name="btnSave" type="submit" style="font-size:11px;font-family:Verdana;font-weight:bold;" runat="server">Save</button>

为什么你没有使用asp:button而是用了button? - Farzin Zaker
这是因为类型按钮是提交。将其更改为button,它就会起作用。解释在此处:https://mzulkamal.com/blog/asp-net-web-form-html-button-tag-fires-two-times-s - shamcs
14个回答

28

我也遇到了同样的问题,花了一段时间才弄清楚!如果你给按钮加上type="button"属性,看起来就可以解决这个问题。


嗯,type="button" 应该是在 HTML 的 button 标签中无效的属性,我觉得是这样的? - marcus erronius
3
当然,我错了!type 可以是 button、reset 或 submit。这很合理。 - marcus erronius
3
我在处理这个问题时非常困难。我的HtmlButton的type属性是“submit”,事件触发了两次,并在我的数据库中造成了各种混乱。将其更改为"type="button""后,它按照人们的预期工作。 - Joel Brown
哇,我已经为这个问题苦苦挣扎了多年,尝试添加会话变量等来检查是否是第二次提交等。这个方法只需要一个快速简单的修复就可以解决它。 - Levi Wallach

9
我刚遇到了同样的问题,想指出一点:从你的事件中删除“Handles btnSave.Click”将防止它被调用两次。例如,在代码后台使用以下代码:
Protected Sub btnSave_OnClick(ByVal sender As Object, ByVal e As System.EventArgs)
    'Do Something
End Sub

不要这样做:

Protected Sub _btnSave_OnClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
    'Do Something
End Sub

适用于VS 2017,NET 4.7.1,VB.NET - Kiquenet
还适用于VS 2008,.Net 3.5,VB ASP.NET。 - Wibisono Indrawan

2
解决方案已经在不同的答案中提到。使用 type ="button"而不是submit。
以下是示例代码。
    <span class="input-group-btn">
      <button id="btnLoadCustomerFile" class="btn btn-default" type="button" runat="server" onserverclick="btnLoadCustomerFile_Click" >Load</button>
       </span>

后端代码用于处理单击事件

 protected void btnLoadCustomerFile_Click(object sender,EventArgs e)
    {
        LoadCustomerFile();
      }

2
请使用本机ASP.NET按钮。
<asp:Button id="btnSave" runat="server" OnClick="btnAddUser_Click"  
     style="font-size:11px;font-family:Verdana;font-weight:bold;" Text="Save" />

我正在使用JQuery主题,因此我使用HTML按钮而不是.NET版本。 - user517406
1
@user517406:您仍然可以将jQuery主题与本机ASP.NET控件一起使用,请参见此处:将jQuery UI按钮样式应用于ASP.NET按钮 - Town
另一位用户评论了这个主题,我也遇到了同样的问题,这并没有将JQuery主题应用于我的.NET按钮,为什么我不知道。 - user517406
@user517406:你尝试过直接将jQuery UI CSS类应用于按钮吗?可以使用$("input[type=button]").addClass('ui-button ui-widget');以jQuery方式实现,或者只需将CssClass="ui-button ui-widget"添加到你的ASP.NET按钮中。让我知道它的效果如何。 - Town
该方法不适用于JQuery主题,因为它只为默认情况添加样式,即不包括按钮悬停、按钮单击等。 - user517406

2

2
如果您正在使用代码后端,请勿在ASP标记中使用OnClick,示例:<button id="btnSave" name="btnSave" type="submit" style="font-size:11px;font-family:Verdana;font-weight:bold;" runat="server">保存</button>

1
我有同样的问题,但如果我在asp标签中删除OnClick,那么我如何在代码后台触发它?我尝试了一下,但什么也没有发生。 - RobD
@RobD 我也遇到了同样的问题,你找到解决方法了吗? - Buchiman

1

可能的一个原因是:
检查你在.aspx文件中按钮的声明。如果你有 'runat=server'onclick="button1_click",并且你在代码后台(即.aspx.vb)中有一个事件处理程序, 它会导致事件被触发两次。下面是一个在xxx.aspx中的示例:

<asp:Button id="button1" onclick="button1_Click" runat="server" Text="Click Me!"></asp:Button>

这句话的意思是:“这个声明应该是:”
<asp:Button id="button1" runat="server" Text="Click Me!"></asp:Button>

祝好运!


0

在 ASP.NET Web 表单页面中,正确的方法(就像其他一些贡献者已经指出的那样)是将 type="button" 属性添加到元素中,并关联一个 onserverclick 事件委托处理程序。

例如:

<button type="button" id="btnSave" runat="server" onserverclick="btnSave_ServerClick" class="btn btn-success btn-label">
    <i class="fa fa-save"></i>Save
</button>

希望这能有所帮助。

0

我曾经遇到过同样的问题,但原因却有所不同。我将容器面板的默认按钮属性设置为触发两次的按钮。在从Asp:Panel中删除"DefaultButton"属性后,问题得到了解决。


0

最近又得回到老派的 ASPX,发现了这个问题。

我的表单设置如下。

<asp:UpdatePanel ID="login" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Panel ID="forgotPassword" runat="server" DefaultButton="lbtnSendLoginDetails" Visible="False">
            <asp:LinkButton ID="lbtnSendLoginDetails" runat="server" >

背后的代码是

Protected Sub lbtnSendLoginDetails_Click(sender As Object, e As EventArgs) Handles lbtnSendLoginDetails.Click

对我来说,答案是从面板中删除DefaultButton属性并添加。
TabIndex="4" 

到 LinkButton。


移除 Handles lbtnSendLoginDetails.Click - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接