c# - pagina - Los controladores de eventos ASP Button.NET no se activan en el primer clic, sino que en el segundo clic después de un PostBack
evitar postback asp.net javascript (8)
Aunque es difícil saber exactamente sin ver el método completo de carga de página, huele un poco como si los controladores de eventos no se conectaran hasta que la página se recargara.
p.ej:
if (IsPostBack) {
// Add handlers here ...
}
Antecedentes: estoy personalizando una aplicación ASP .NET / C existente. Tiene su propio pequeño "marco" y convenciones que los desarrolladores deben seguir al ampliar / personalizar su funcionalidad. Actualmente estoy ampliando parte de su funcionalidad administrativa, a la que el marco proporciona un contrato para hacer cumplir la implementación del método GetAdministrationInterface()
, que devuelve System.Web.UI.Control
. Este método se llama durante el método Page_Load()
de la página que aloja la interfaz GUI.
Problema: tengo tres botones en mi GUI, a cada uno de ellos se le ha asignado un Manejador de eventos. La GUI de mi administración se carga perfectamente, pero hacer clic en cualquiera de los botones no hace lo que espero que hagan. Sin embargo, cuando los hago clic por segunda vez, los botones funcionan.
Coloqué puntos de interrupción al comienzo de cada método de manejo de eventos y pasé por mi código. En el primer clic, ninguno de los controladores de eventos se activaron. En el segundo clic, dispararon.
¿Algunas ideas?
Ejemplo de definición de botón (dentro de GetAdministrationInterface
)
public override Control GetAdministrationInterface()
{
// more code...
Button btn = new Button();
btn.Text = "Click Me!";
btn.Click += new EventHandler(Btn_Click);
// more code...
}
Ejemplo de definición de método de controlador de eventos
void Btn_Click(object sender, EventArgs e)
{
// Do Something
}
Método Page_Load
que llama a GetAdministrationInterface
protected void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsAsync)
{
List<AdministrationInterface> interfaces = <DATABASE CALL>;
foreach(AdministrationInteface ai in interfaces)
{
placeholderDiv.Controls.Add(ai.GetAdministrationInterface());
}
}
}
Buena pena! Sabía que iba a ser algo así de estúpido. Puramente mi culpa, por supuesto, y mi falta de conocimiento en ASP .NET.
Después de hacer una gran cantidad de búsquedas en Google y, finalmente, ser bloqueado por Google bajo la sospecha de ser un bot que ejecutaba scripts automatizados, logré exprimir una última búsqueda y tropecé con este article . Ya a punto de darme por vencido, hice mi mejor esfuerzo para leer el artículo sin saltear 10 líneas a la vez o buscar bonitas imágenes. En la sección titulada Asignar identificaciones a los controles creados dinámicamente , leo estas palabras mágicas y alegres:
Si ve el código HTML de origen antes de hacer clic en el botón que no funciona y después de haber hecho clic en él, notará una pequeña diferencia. Los botones tienen diferentes ID de HTML antes y después de la devolución posterior. Obtuve ctl04 y ctl05 antes del post-back y ctl02 y ctl03 después del post-back.
El botón ASP.NET reconoce los eventos al buscar un valor para su ID en la colección Request.Form. (En verdad sucede de manera diferente y los controles no comprueban la recolección de Request.Form por sí mismos. Page pasa los datos de la publicación a los controles por sus ID y a los controles que están registrados para recibir notificaciones sobre los datos de la publicación). ASP.NET no activa el evento Click, porque la ID del botón ha cambiado entre las publicaciones posteriores. El botón en el que ha hecho clic y el botón que ve después son botones diferentes para ASP.NET.
Efectivamente, cuando vi el HTML la primera vez, mi botón tenía el ID ctl04$ctl36
. Después de hacer clic en el botón, mi botón tenía el ID ctl04$ctl33
.
¡Así que ahí lo tienes! Todo lo que tenía que hacer era establecer la ID en los botones y ¡listo! Mis controladores de eventos ahora están siendo llamados!
Solución de muestra:
public override Control GetAdministrationInterface()
{
// more code...
Button btn = new Button();
btn.Text = "Click Me!";
// !!THE BANE OF MY EXISTENCE!!
btn.ID = "The_Bane_of_My_Existence";
// !!THE BANE OF MY EXISTENCE!!
btn.Click += new EventHandler(Btn_Click);
// more code...
}
Qué gran manera de pasar dos días ...
Estaba enfrentando el mismo problema. Mi botón se congeló después de mi primer clic. Para mí, este molesto problema se resolvió cuando desactivé el atributo EnableViewState
del botón.
Incluso yo tuve el mismo problema. la causa fue "localhost: 1656 / secure / login.aspx? ReturnUrl =% 2f ". si la solicitud contiene % 2f como cadena de consulta, la primera publicación no se realizará correctamente aunque " % 2f " represente " / ".
una forma de evitar esto teniendo una verificación de estado en la carga de la página
protected void Page_Load(object sender, EventArgs e)
{
string queryString = Request.QueryString.ToString();
if(queryString == "ReturnUrl=%2f")
{
Response.Redirect("/secure/login.aspx");
}
}
Para mí fue UpdatePanel
, mi Button y mi TextBox estaban dentro de un UpdatePanel
, así que cuando UpdatePanel
de nuevo, causó un comportamiento extraño. Lo tomó fuera del UpdatePanel
y eso lo solucionó.
Tuve el mismo problema Y busqué en internet que no encontré una solución. Después de eso encontré el código de muestra y lo usé. Funcionó para mí El enlace del sitio web está a continuación:
Tuve el mismo problema, pero la respuesta aceptada aquí no fue la causa. Tenía un cuadro de texto y un botón de búsqueda, y al hacer clic en el botón la primera vez no realizó la búsqueda. El controlador de eventos del botón no estaba siendo golpeado. Pero al hacer clic en el botón por segunda vez desencadenó el evento en el servidor. Aquí es por qué:
Si tiene un <asp:Textbox>
con su AutoPostBack
configurado en true
, después de escribir en el cuadro de texto y luego moverlo para hacer clic en un botón, el cuadro de texto provoca una devolución posterior inmediatamente en el momento en que pierde el foco. Por lo tanto, el clic incluso en el botón no cuenta (la página ya está publicada como resultado del evento del cuadro de texto). Es por eso que cuando haces clic en el botón una segunda vez, funciona porque el cuadro de texto no está involucrado en la segunda publicación posterior.
Establezca la propiedad AutoPostBack
de <asp:Textbox>
en false
para solucionar este problema.
Una solución rápida es establecer una ID para el control ASCX que está cargando en una página. Por ejemplo, si su código es así:
UserControl SpecsControl = (UserControl)Page.LoadControl("../name.ascx");
SpecsContainer.Controls.Add(SpecsControl);
entonces necesitas agregar una línea (antes de Controls.Add):
SpecsControl.ID = "Aribtrary_Name";
Luego, su método de control se activa con el primer clic.