asp.net asp.net-ajax user-controls postback

asp.net - Perdiendo Button.Click eventos después de la primera devolución de datos parcial en UpdatePanel



asp.net-ajax user-controls (3)

Tengo una página que tiene una sola instancia de UserControl que tiene un solo UpdatePanel. Dentro del UpdatePanel hay varios controles de botones. El evento Click para estos controles está cableado en el código subyacente, en el evento Init del UserControl.

Recibo el evento Click para el primer botón que presiono, cada vez, no hay problema. Después de eso, solo obtengo los eventos Click para un botón (SearchButton); el resto se ignora. He incluido el código para el siguiente control: en aras de la brevedad, he excluido los métodos del controlador de eventos click, pero todos son de la variedad estándar "vacío Button_Click (remitente del objeto, EventArgs e)". ¿Algunas ideas?

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


Parece que agregar UseSubmitBehavior = "false" a las definiciones de los botones ha resuelto mi problema. Todavía no sé por qué el primer clic del botón funcionó.


La razón más probable para esto sería la identificación del cliente que .Net genera para el cambio de sus controles. Estos se asignan dinámicamente y pueden cambiar entre devoluciones / devoluciones de datos parciales.

Si los controles se agregan dinámicamente al panel, la ID de su botón podría ser diferente entre las devoluciones, lo que causaría que .Net no pueda vincular el evento de clic al controlador de eventos correcto en su código.


En mi caso, tenía un LinkButton dentro de un controlador de eventos dgPatients_ItemDataBound que usaba la propiedad PostBackUrl .

En el momento en que cambié LinkButton a HyperLink , el problema desapareció.