Asp:Button 更新面板内的点击事件未触发
Asp:Button click event inside update panel not firing
什么会导致 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>
- 第一次在更新面板内触发任何按钮时,以下例程将按此顺序触发。
- 发生回发后再次触发按钮会导致回发,
Load
和 PreRenderComplete
事件都会触发,但会跳过点击事件。
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# 编写的。这也不是一个很好的答案,因为我无法复制您的问题。按钮和 LinkButton 之间的区别在于 Button
使用提交行为,而 LinkButton
使用 javascript 回发。您可以尝试将 UseSubmitBehavior="false"
放在 Button 上,这将使它像 LinkButton
.
一样工作
这是我的完整测试代码。作为 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";
}
}
每次单击按钮(或 LinkButton)都有效并更新文本框:
Page_Loaded
55:54:185
PreRenderComplete
什么会导致 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>
- 第一次在更新面板内触发任何按钮时,以下例程将按此顺序触发。
- 发生回发后再次触发按钮会导致回发,
Load
和PreRenderComplete
事件都会触发,但会跳过点击事件。
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# 编写的。这也不是一个很好的答案,因为我无法复制您的问题。按钮和 LinkButton 之间的区别在于 Button
使用提交行为,而 LinkButton
使用 javascript 回发。您可以尝试将 UseSubmitBehavior="false"
放在 Button 上,这将使它像 LinkButton
.
这是我的完整测试代码。作为 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";
}
}
每次单击按钮(或 LinkButton)都有效并更新文本框:
Page_Loaded
55:54:185
PreRenderComplete