在更新面板中的Asp:Button点击事件没有触发

4

发生部分更新后,是什么原因导致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>
  • 当在更新面板内首次触发任何按钮时,以下程序按照此顺序运行。
  • 在发生 postback 后,再次触发按钮会导致 postback,同时触发 LoadPreRenderComplete 事件,但 click 事件会被跳过。

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 控件时,虽然回发已经发生,但单击事件被忽略了。有人能解释这种行为的原因吗?



1
你可以尝试在你的标记中设置 OnClick="btnSave_Click" 吗? - hardkoded
https://dev59.com/_ILba4cB1Zd3GeqPZhQt - Nikolaos Polygenis
一眼看去:在postback之后,如果upPan没有更新(upPan.Update()),那么控件就会失去它们的事件监听器。 - Hugo Yates
@HugoYates 如果我错了请指出,但是不是在更新面板内触发的 postbacks 会自动导致面板被更新吗? - DreamTeK
@kblok 是的,我尝试过了,但效果还是一样。 - DreamTeK
显示剩余3条评论
1个回答

2
首先,抱歉我的回答是用C#。由于我无法复制您的问题,因此这也不算是一个完整的答案。按钮和链接按钮之间的区别在于,Button使用提交行为,而LinkButton使用JavaScript回发。您可以尝试在您的按钮上放置UseSubmitBehavior="false",这将使它像LinkButton一样工作。
以下是我的完整测试代码。由于C#和VB处理事件的方式略有不同,因此我必须进行一些更改,例如删除Handles
<%@ 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>

CodeBehind:

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";
    }
}

点击按钮(或链接按钮)可以使文本框更新。
Page_Loaded
55:54:185
PreRenderComplete

1
是的,JavaScript 冲突。感谢您指出正确的方向。 - DreamTeK

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