2009-04-25 41 views
9

Tengo una página que usa una página maestra, varios RequiredFieldValidators y el extensor de autocompletar Web Toolkit. El siguiente código muestra solamente el mínimo de la página:asp: ImageButton no activa el evento onclick

<%@ Page Language="C#" 
    AutoEventWireup="true" 
    CodeFile="Login.aspx.cs" 
    MasterPageFile="~/master.master" 
    Inherits="Login" %> 

<asp:Content id="Content1" 
    contentplaceholderid="ContentPlaceHolder1" 
    runat="server"> 
    <asp:UpdatePanel ID="pnlUpdate" runat="server"> 
     <ContentTemplate> 
      <div> 
       <asp:ImageButton class="submitButton" 
        imageurl="images/button_submit.gif" 
        id="btnSubmit" 
        runat="server" 
        onclick="btnSubmit_ServerClick"/> 
      </div> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</asp:Content> 

de código subyacente:

protected void btnSubmit_ServerClick 
     (object sender, ImageClickEventArgs e) 
{ 
    //breakpoint here does not get hit 
} 

La etiqueta <form runat="server"> se encuentra en la página maestra. El código anterior no activa el evento onclick. Si me deshago de la página maestra y agrego una etiqueta de formulario a la página, funciona. ¿La etiqueta del formulario en la página maestra no es compatible, o se supone que funciona de alguna manera? alt text http://digitalcopy.warnerbros.com/images/mainmenu.gif?provider=00079&disc=03403AAA-1D20-47F2-91FA-5EE632832659

+0

La única respuesta que trabajó para mí era de otra pregunta. :) http://stackoverflow.com/a/15911261/1603799 – MiniRagnarok

Respuesta

0

Debe tener el control en una forma runat = server en alguna parte, puede estar en la página maestra o en el archivo .aspx. Verifique que la etiqueta de formulario de la página maestra sea runat = servidor

AutoEventWireup es la propiedad que permite la sintaxis que está utilizando. Verifique dos veces la configuración en la Página maestra, WebForm y también se puede establecer en web.config.

si eso no funciona, siempre se puede código explicilty que (que yo prefiero)

<script runat=server> 

protected override void OnInit(EventArgs e) 
    { 
     btnSubmit.Click += delegate(object sender, EventArgs e1) 
     { 

     }; 
     base.OnInit(e); 
    } 

</script> 

UpdatePanel puede meterse con los eventos del lado del servidor también ser levantado, por lo que probarlo sin el UpdatePanel. Y estoy seguro de que tiene un ScriptManager en la Página maestra

+0

La página maestra también tiene AutoEventWireup = true, y el web.config no lo reemplaza. Gorrón. – cdonner

+0

Moví la etiqueta del formulario (y el administrador del script) de la página maestra a la página de contenido. El evento se dispara ahora, y todavía tengo la página maestra. No es ideal, pero es suficiente solución por ahora. – cdonner

+0

Si tiene un UpdatePanel en su página maestra, intente eliminarlo –

0

A partir del código que ha proporcionado, parece que falta el <asp:scriptmanager> de su página. Debe realizar uno de los siguientes:

  1. Tener la <asp:scriptmanagerproxy> en la página y la <asp:scriptmanager> en la página maestra.
  2. Tiene <asp:scriptmanager> en su página y no <asp:scriptmanager> en la página maestra.

Personalmente, recomiendo tener la etiqueta <form> en la página maestra, pero eso es una preferencia personal.

+0

Gran punto. Sin embargo, agregar un scriptmanagerproxy no ayudó. Devolví el formulario al maestro y guardé el administrador de scripts en la página de contenido, que tampoco funcionó. Solo funciona si las etiquetas tanto de formulario como de gestor de script se encuentran en la página de contenido. Extraño. – cdonner

0

Siempre puede intentar sacar el UpdatePanel y ver si funciona. Por lo general, empiezo sin el UpdatePanel, hago que todo funcione del modo que quiero y luego agrego el UpdatePanel y elimino cualquier problema que pueda causar.

El formulario en la página maestra funciona para mí, por lo que el ScriptManager/ScriptManagerProxy mencionado por @Keltex podría ser un problema, aunque a veces los olvido y generalmente salgo con la suya.

Con UpdatePanel, el evento de clic del botón se gestionará a través de Javascript, por lo que puede obtener FireBug o equivalente (según el navegador) y seguir lo que realmente está sucediendo. ¿Se está tropezando con la validación y no la ves? ¿Hay algún error JS en alguna parte (el Toolkit de Control no es perfecto siempre)? ¿La página realmente está publicando y simplemente no está activando el controlador de eventos?

+0

Me salió strep a través del JS y vi el evento que se procesa, y no se produjo ninguna excepción. Por qué no se envía al servidor no fue obvio para mí. Tendría que profundizar en el código generado del lado del cliente para poder entenderlo. La eliminación de UpdatePanel no cambió el comportamiento. – cdonner

+0

¿Qué sucede si intercambias un botón normal para el botón de imagen? ¿Funciona? ¿Se comporta igual en todos los navegadores? – Jared

+0

Al leer su comentario más de cerca, suena como un problema de validador/JS, ya que no está volviendo al servidor. ¿Tiene algún otro control, como controles del Toolkit de control, que pueda interferir con el botón de imagen? – Jared

11

También puede verificar si su ImageButton no activa la validación. Si establece su propiedad CausesValidation en false (por supuesto si tiene sentido).

+0

Activa la validación, porque funciona bien con la solución en su lugar. – cdonner

0

En mi página web estoy creando botones de imagen dinámicamente dentro de una tabla contenida en un panel de actualización.Los botones son creados por este código:

for (int i = 0; i < 15; i++) 
    { 
     TableRow tr = new TableRow(); 
     for (int j = 0; j < 20; j++) 
     { 
      TableCell tc = new TableCell(); 
      ImageButton ib = new ImageButton(); 
      ib.Click += new ImageClickEventHandler(ImageButton1_Click); 
      ib.ImageUrl = "../img/defaultCell.jpg"; 
      ib.ID = i + ":" + j; 
      tc.Controls.Add(ib); 
      tc.Width = 25; 
      tc.Height = 25; 
      tr.Cells.Add(tc); 
     } 
     GameTable.Rows.Add(tr); 
    } 

}

los botones de imagen no activará haga clic en eventos. SIN EMBARGO, si la línea 'ib.ID = ...' está comentada, ¡lo hacen! Esa única alternancia parece solucionar todos los problemas. No tengo idea de por qué. Si alguien puede explicar esto, y también decirme cómo desencadenar eventos manteniendo la capacidad de establecer id de botón, estaría muy agradecido

+3

Debe publicar esto como una pregunta separada, no como una respuesta. –

0

Creo que puede tener algo que ver con el hecho de que vuelva a asignar el id después de crear & asignando el controlador de eventos?

¿Incluso tiene que asignar la identificación? - ¿Seguro que esto está hecho para ti de todos modos? - True eliminando 'ib.ID = i + ":" + j;'

3

Tuve un problema similar (escenario diferente). Usé Page.RegisterRequiresRaiseEvent(ImageButton) y mi evento onclick comenzó a dispararse. ¿Por qué tenía que hacer eso? No lo sé.

2

Tengo un problema similar con el botón de imagen y encontré la causa raíz. Está utilizando

"ib.ID = i + ":" + j;"

como el ID de la ImageButton, el ":" es el nombre ilegal utilizar, como lo está creando mediante programación, ASP.NET permite que sea creado.

En tiempo de ejecución, si nos fijamos en el origen HTML de la página, verá que los caracteres especiales se ignoran o reemplazan con "_". Por lo tanto, la página no puede encontrar el control correcto, por lo que el evento no se activará. Intente cambiar el nombre con texto sin formato, el evento se disparará.

0

Asegúrese de que utiliza OnClick en lugar de onClick

Su panel de actualización podría jugar con la devolución de datos. Pruébelo sin UpdatePanel y vea si ese es el culpable.

2

ib.ID = i + ":" + j;

debe cambiarse a

ib.ID = i.toString()+":"+j.toString(); 

Si aún así no funciona intentar hacer uso de la StringBuilder a la acumulación de la Identificación y asignar más tarde a la propiedad ib.ID

0

Tuve el mismo problema que el evento OnClick de ImageButton no se activaba. Pero el problema real era que, a nivel de formulario, tenía onSubmit="return false;"

3

Mi solución era establecer CausesValidation del ImageButton en falso.

+0

Gracias esto también estaba bloqueando el lanzamiento de mi evento – JsonStatham

0

Estaba enfrentando el mismo problema, donde estaba creando dinámicamente un ImageButton y el clic de ese evento no se disparaba. por lo tanto, creé el botón Imagen en if (IsPostBack). Ahora está funcionando bien. E incluso si la página se actualiza, se conservará ImageButton.

0

Acabo de resolver un problema similar cuando OutputCache estaba habilitado. Al cambiar de asp:ImageButton a asp:Button, el evento se desencadena correctamente. Probablemente asp:ImageButton tiene algún error con OutputCache.

0

Después de que ninguna de las sugerencias anteriores funcionó para mí, hice una prueba más llamando a la creación del botón en OnInit(). Esto solucionó mi problema y ahora el evento OnClick se está disparando.

0

Esta es la solución que trabajó para mí

Si va a enlazar a través de datos vinculados a continuación, utilizar los controles bajo demanda en lugar de attr attr OnClick

Cuestiones relacionadas