Asp: событие нажатия кнопки на панели обновления не срабатывает

Что может привести к тому, что кнопка 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.

Кто-нибудь может объяснить, что вызвало бы такое поведение?

1 ответ

Решение

Прежде всего, извиняюсь, мой ответ на C#. Это также не очень хороший ответ, так как я не могу повторить вашу проблему. Различие между кнопками и кнопками LinkButtons заключается в том, что Button использует представить поведение и LinkButton использует постбэк JavaScript. Вы можете попробовать положить UseSubmitBehavior="false" на вашей кнопке, это заставит его работать как 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>

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

Нажатие кнопки (или LinkButton) работает и обновляет TextBox каждый раз:

Page_Loaded
55:54:185
PreRenderComplete
Другие вопросы по тегам