c# - ASP :Button click event inside update panel not firing

标签 c# asp.net vb.net updatepanel postback

什么会导致 asp 按钮在发生部分更新后不触发?

<asp:UpdatePanel ID="upPan" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:Button ID="btnSave" ClientIDMode="Static" runat="Server" Text="Save" CausesValidation="false" />
  </ContentTemplate>
</asp:UpdatePanel>
  • 第一次在更新面板内触发任何按钮时,以下例程将按此顺序触发。
  • 回发发生后再次触发按钮会导致回发,两者都是LoadPreRenderComplete事件触发但点击事件被跳过。

VB

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.PageLoad
  //Runs everytime
End Sub

Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
 //Doesn't fire after first postback.
End Sub

Protected Sub Page_PreRenderComplete(sender As Object, e As EventArgs) Handles Me.PreRenderComplete
  //Runs everytime
End Sub

失败的解决方案

解决此问题的建议包括:

  • ChildrenAsTriggers= "True" 这已经是 UpdatePanel 的默认行为,无需更改。
  • <asp:AsyncPostBackTrigger ControlID="btnSave" EventName="Click" /> 同样,默认情况下,面板的子控件会导致异步回发,并且声明触发器是多余的。

成功解决

如果我简单地更改 asp:Button进入 asp:LinkButton问题已解决。


总结

当发件人是一个 asp:Button 控件时,正在回发但是点击事件被错过。

谁能解释是什么导致了这种行为?

最佳答案

首先,很抱歉我的回答是用 C# 编写的。这也不是一个很好的答案,因为我无法复制您的问题。 Button 和 LinkBut​​ton 之间的区别在于 Button 使用提交行为,而 LinkBut​​ton 使用 javascript 回发。您可以尝试将 UseSubmitBehavior="false" 放在 Button 上,这将使它像 LinkBut​​ton 一样工作。

这是我的完整测试代码。作为 C#,我不得不做一些更改,因为它没有 Handles - 这可能是问题的关键,因为 C# 和 VB 处理事件的方式略有不同

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test3.aspx.cs" Inherits="Test3" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>

            <asp:ScriptManager ID="PageScriptManager" runat="server" />
            <asp:UpdatePanel ID="upPan" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button ID="btnSave" ClientIDMode="Static" runat="Server" Text="Button" CausesValidation="false" OnClick="btnSave_Click" />
                    <asp:LinkButton ID="lnkButton" ClientIDMode="Static" runat="Server" Text="Link Button" CausesValidation="false" OnClick="btnSave_Click" />
                    <asp:TextBox ID="txtBox" runat="server" TextMode="MultiLine" Rows="3" />
                </ContentTemplate>
            </asp:UpdatePanel>

        </div>
    </form>
</body>
</html>

代码隐藏:

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        txtBox.Text = "Page_Loaded";
    }

    protected void btnSave_Click(object sender, EventArgs e)
    {
        txtBox.Text += "\n" + DateTime.Now.ToString("mm:ss:fff");
    }

    protected void Page_PreRenderComplete(object sender, EventArgs e)
    {
        txtBox.Text += "\nPreRenderComplete";
    }
}

每次单击按钮(或 LinkBut​​ton)都会起作用并更新文本框:

Page_Loaded
55:54:185
PreRenderComplete

关于c# - ASP :Button click event inside update panel not firing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46276096/

相关文章:

.net - 取消按钮需要第二次按下

c# - 如何在使用 DllImpot 属性时更改托管代码中的函数名称?

c# - EF Core DatabaseGeneratedOption.Computed 不工作

c# - 使用 async/await 时防止 winforms UI 阻塞

javascript - 如何从 HTML 集合中提取名称?

c# - 为什么 Microsoft 从 MVC 4 RC 的模板中删除了基于 Ajax 的登录和注册工作流?

c# - 循环遍历 RectangleShape 控件

c# - 如何修改使用 DB-first Entity Framework 创建的枚举

c# - 如何从 .NET 可执行文件中获取输出并传送到 MFC 应用程序?

asp.net - 隐藏 Kendo UI DatePicker 文本框