Perdiendo Button.Click eventos después de la primera devolución parcial en UpdatePanel
-
05-07-2019 - |
Pregunta
Tengo una página que tiene una sola instancia de un UserControl que a su vez tiene un único UpdatePanel. Dentro del UpdatePanel hay varios controles de botón. El evento Click para estos controles está conectado en el código subyacente, en el evento Init del UserControl.
Obtengo el evento Click para el primer botón que presiono, cada vez, no hay problema. Después de eso, solo obtengo eventos Click para un botón (SearchButton) - el resto se ignora. He incluido el código para el control a continuación: por motivos de brevedad, he excluido los métodos del controlador de eventos de clic, pero todos son estándar del botón "void Button_Click" (objeto remitente, EventArgs e) " variedad. ¿Alguna idea?
<asp:UpdatePanel ID="PickerUpdatePanel" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel ID="Container" runat="server">
<div>
<asp:TextBox ID="PickerResults" runat="server" style="margin-right: 3px;" SkinID="Plain" />
<asp:Image
ID="LaunchPopup" runat="server" ImageUrl="~/images/icons/user_manage.png"
ImageAlign="Top" BorderColor="#294254" BorderStyle="Dotted" BorderWidth="1px"
Height="20px" Width="20px" style="cursor: pointer;" />
</div>
<asp:Panel ID="PickerPanel" runat="server" DefaultButton="OKButton" CssClass="popupDialog" style="height: 227px; width: 400px; padding: 5px; display: none;">
<asp:Panel runat="server" id="ContactPickerSearchParams" style="margin-bottom: 3px;" DefaultButton="SearchButton">
Search: <asp:TextBox ID="SearchTerms" runat="server" style="margin-right: 3px;" Width="266px" SkinID="Plain" />
<asp:Button ID="SearchButton" runat="server" Text="Go" Width="60px" SkinID="Plain" />
</asp:Panel>
<asp:ListBox ID="SearchResults" runat="server" Height="150px" Width="100%" SelectionMode="Multiple" style="margin-bottom: 3px;" />
<asp:Button ID="AddButton" runat="server" Text="Add >>" style="margin-right: 3px;" Width="60px" SkinID="Plain" />
<asp:TextBox ID="ChosenPeople" runat="server" Width="325px" SkinID="Plain" />
<div style="float: left;">
<asp:Button ID="AddNewContact" runat="server" SkinID="Plain" Width="150px" Text="New Contact" />
</div>
<div style="text-align: right;">
<asp:Button ID="OKButton" runat="server" Text="Ok" SkinID="Plain" Width="100px" />
</div>
<input id="SelectedContacts" runat="server" visible="false" />
</asp:Panel>
<ajax:PopupControlExtender ID="PickerPopEx" runat="server" PopupControlID="PickerPanel" TargetControlID="LaunchPopup" Position="Bottom" />
</asp:Panel>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="AddButton" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="SearchButton" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="AddNewContact" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
public partial class ContactPicker : System.Web.UI.UserControl
{
protected void Page_Init(object sender, EventArgs e)
{
SearchButton.Click += new EventHandler(SearchButton_Click);
AddButton.Click += new EventHandler(AddButton_Click);
OKButton.Click += new EventHandler(OKButton_Click);
}
// Other code left out
}
Solución
Parece que al agregar UseSubmitBehavior = " false " a las definiciones de botones ha resuelto mi problema. Aún no sé por qué ese primer clic en el botón funcionó en absoluto.
Otros consejos
La razón más probable para esto sería la identificación de los clientes que .Net genera para el cambio de sus controles. Estos se asignan dinámicamente y podrían cambiar entre devoluciones / devoluciones parciales.
Si los controles se agregan dinámicamente al panel, la ID de su botón podría ser diferente entre las devoluciones de datos que hacen que .Net no pueda vincular el evento de clic con el controlador de eventos correcto en su código.
En mi caso, tuve un LinkButton
dentro de un controlador de eventos dgPatients_ItemDataBound
que usaba la propiedad PostBackUrl
.
En el momento en que cambié el LinkButton
a un HyperLink
, el problema desapareció.