2009-05-01 27 views
5

ASP.NET 2.0, probando en FF3 e IE7.TextBox causa devolución de botón en ASP.NET

Cuando presiono el botón "enter" de un cuadro de texto, se desencadena el evento "OnClick" correspondiente al primer ImageButton en la página. Si elimino ese botón de imagen, desencadena el siguiente evento OnClick de ImageButton en la página.

Desde la consola FireBug, si uso JavaScript para enviar el formulario, esto no sucede. Pero, por cualquier razón, al presionar enter desde el cuadro de texto se desencadena el evento ImageButton no relacionado.

Encontré this question que tenía un problema similar, sin embargo, la respuesta propuesta a esa solución no funciona, ya que los ImageButtons no tienen una propiedad "UseSubmitBehavior" en ellos.

No entiendo por qué este evento se está disparando. Si miro Request.Form, puedo ver que __EVENTTARGET está vacío, y de hecho está publicando todo el contenido del formulario (todos mis cuadros de texto), pero también incluye imageButton.x y imageButton.y pares clave/valor.

¿Por qué es esto? Supongo que podría detectar presionar teclas "enter" desde estos cuadros de texto con javascript, pero mi experiencia en el pasado es que este comportamiento es muy variable entre los navegadores. ¿Alguna sugerencia?

Respuesta

3

Puede intentar configurar un botón predeterminado en un panel ASP o en su formulario. Esto le permitirá controlar lo que sucede cuando un usuario pulsa la tecla Intro.

+4

Terminé simplemente agregando un nuevo botón asp: sin evento onclick y configuré el estilo para que no se muestre ninguno. Se sintió más limpio que una solución JS para detectar la tecla Intro. – Matt

0

Es el comportamiento predeterminado para un botón enter, presione en un área que no sea de texto para publicar un formulario. Tendría que manejarlo en un método de JavaScript para detener la devolución de datos.

Te sólo tiene que comprobar la propiedad window.event.keyCode para ver si su igual a 13. Si es así, restablecerlo a 0.

function KeyPress() 
    { 
    if (window.event.keyCode == 13) 
     { 
      window.event.keyCode = 0; 
     } 
    } 
+0

'window.event' no existe en FF3. – robertc

0

supongo que podría detectar " enter "presionar teclas de estos cuadros de texto con javascript

Eso es lo que hice para evitar ese comportamiento y funciona muy bien en IE7 y FF3. Es un poco antinatural.

Aquí es un exemple genérica:

function TextBox1_KeyDown(sender, e) 
    { 
    var key; 
     if(window.event) 
      key = window.event.keyCode; //IE 
     else 
      key = e.which; //firefox 
     if(key == 13 && $("#TextBox1").val() != "") 
     { 
      WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("TextBox1", "", true, "", "", false, true)); 
     } 
     return (key != 13); 
    } 

Solía ​​WebForm_DoPostBackWithOptions porque necesitaba validadores a desencadenar. De lo contrario, es posible que desee usar __DoPostBack.

Éstos son los "prototipos":

function __doPostBack(eventTarget, eventArgument) 

function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) 
{ 
    this.eventTarget = eventTarget; 
    this.eventArgument = eventArgument; 
    this.validation = validation; 
    this.validationGroup = validationGroup; 
    this.actionUrl = actionUrl; 
    this.trackFocus = trackFocus; 
    this.clientSubmit = clientSubmit; 
} 

function WebForm_DoPostBackWithOptions(options) 

espero que ayude.

P.S .: Usé JQuery aquí pero $ get sería lo mismo.

1

Puede desactivar la tecla Intro para evitar que se presione, por lo que el usuario tendrá que hacer clic en sus ImageButtons.Sólo tienes que pegar este bloque Javascript en su página:

<script type="text/javascript"> 
function stopRKey(evt) { 
    var evt = (evt) ? evt : ((event) ? event : null); 
    var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); 
    if ((evt.keyCode == 13) && (node.type=="text")) {return false;} 
} 
document.onkeypress = stopRKey; 
</script> 
6

aquí es una solución más elegante

<asp:TextBox ID="TextBox1" runat="server" onkeydown = "return (event.keyCode!=13);" > </asp:TextBox>

leer el post entero here

0

Aquí es una solución elegante que he encontrado, en caso de que alguien else tiene este problema (en caso de que ninguna otra solución funcione para usted, ya que no funcionó para mí):

<asp:UpdatePanel runat="server"> 
<ContentTemplate> 
    <asp:Panel runat="server" DefaultButton="doNothingButton"> 
     <ul id="shopping-list-ul"> 
     </ul> 
     <asp:Button CssClass="invisible" runat="server" ID="doNothingButton" OnClientClick="return false;" /> 
    </asp:Panel> 
</ContentTemplate> 

El cuadro de texto vacación por sí misma estaba dentro de la ul (generada por JavaScript).
Al presionar enter se activará el "doNothingButton", que devolverá false en el lado del cliente, ¡y no se devolverá ninguna devolución!

1

Recientemente, he estado haciendo más en el cliente con servicios web y menos devoluciones. Al mover mis controles fuera del elemento de formulario (o eliminarlo del todo), el problema desaparece. Está insertado por defecto en las páginas aspx, pero hasta hace poco no se me había ocurrido que no lo necesitaba para mucho de lo que hago.

3

Estoy teniendo el mismo problema en mi proyecto.

Este problema se produce porque ASP.NET siempre asumirá que el primer elemento que se hereda de IButton interfaz (Button y ImageButton) es el botón por defecto de la página.

Hipotéticamente, si utiliza un botón de barra en lugar de Button o ImageButton, este problema está resuelto.

Puede encontrar más información here on MSDN.

Cuestiones relacionadas