2010-12-04 170 views
5

Tengo el siguiente problema en ASP.NET: hay un formulario que contiene un cuadro de texto y un botón al lado que se supone debe ser presionado por el usuario después de llenar el cuadro (muestra en http://www.burnthespam.info, haga clic en "Seleccione su uno" o cuando use ReCaptcha en una ventana emergente). A menudo, en cambio, los usuarios presionan la tecla ENTER para enviar el formulario.Manejo del botón ENTRAR en TextBox, ASP.NET

Esto no provoca que se active el evento de clic en el botón y posiblemente cause un comportamiento inesperado. En burnthespam, "traté" de resolver comprobando si había datos dentro del cuadro de texto (pero ahora si haces algo diferente a presionar ENTER es como si lo hubieras presionado) para solucionarlo.

¿Sabes si hay otra forma de manejar el envío del formulario con la clave ENTER, o un fragmento de Javascript que cuando presionas ENTER presiona el botón que me gusta?

EDITAR

Quiero controlar el evento tecla ENTER en el lado del servidor , es decir. Ya tengo

protected void button_Click(object sender, EventArgs e) 
    { 
     Response.Redirect(...); 
    } 

Quiero que el método que se llama no sólo cuando envíe el formulario utilizando el botón (clic o espacio con él resaltado) sino también cuando un usuario presiona ENTER cuando se enfoca el cuadro de texto

EDIT 2

¿Conoce si es posible programación clic en un botón en Javascript? Tal vez no sea posible evitar phishing/spamming (consulte Facebook y "compartir con amigos", por ejemplo), pero aún me gustaría preguntar ...

Respuesta

0

Hay algunas maneras en que puede establecer un botón predeterminado utilizando la propiedad DefaultButton del objeto de formulario o la propiedad DefaultButton de un panel, pero he encontrado que no eran confiables en el pasado en varios navegadores, por lo que generalmente confío en javascript.

El único inconveniente de este código es que debe desactivar la validación de eventos con una directiva de página, pero debe activar eventos de clic y desencadenar validadores y todo eso.

Aquí hay un ejemplo del código que usamos. Normalmente pondría la función de registro en una clase de utilidad, pero para este ejemplo está en el código de la página. Pruebe esto.

<%@ Page Language="C#" EnableEventValidation="false" %> 

    <script runat="server"> 

     protected void cmdSubmit1_Click(object sender, EventArgs e) 
     { 
      litValue.Text = "Value 1 - You entered: " + txtValue1.Text; 
     } 
     protected void cmdSubmit2_Click(object sender, EventArgs e) 
     { 
      litValue.Text = "Value 2 - You entered: " + txtValue2.Text; 
     } 

     /// <summary> 
     /// This function registers what button is clicked based on whatever control currently has focus 
     /// so for example if the user password field has focus then you can cause the enter button to click 
     /// if the enter key is pressed This works with ie and firefox as far as I know 
     /// </summary> 
     /// <param name="ControlWithFocus"></param> 
     /// <param name="ControlToClick"></param> 
     private void RegisterDefaultButton(System.Web.UI.Control ControlWithFocus, System.Web.UI.Control ControlToClick) 
     { 

      PostBackOptions p = new PostBackOptions(ControlToClick); 
      p.PerformValidation = true; 
      if (ControlToClick is Button) 
      { 
       p.ValidationGroup = ((Button)ControlToClick).ValidationGroup; 
      } 
      else if (ControlToClick is ImageButton) 
      { 
       p.ValidationGroup = ((ImageButton)ControlToClick).ValidationGroup; 
      } 
      else if (ControlToClick is LinkButton) 
      { 
       p.ValidationGroup = ((LinkButton)ControlToClick).ValidationGroup; 
      } 

      p.RequiresJavaScriptProtocol = false; 

      AttributeCollection a = null; 
      if (ControlWithFocus is HtmlControl) 
      { 
       a = ((System.Web.UI.HtmlControls.HtmlControl)ControlWithFocus).Attributes; 
      } 
      else if (ControlWithFocus is WebControl) 
      { 
       a = ((System.Web.UI.WebControls.WebControl)ControlWithFocus).Attributes; 
      } 

      if (a != null) 
      { 
       a["onKeyDown"] = string.Format("if (event.keyCode == 13) {{{0}}}" 
         , ControlToClick.Page.ClientScript.GetPostBackEventReference(p)); 
      } 
     } 


     protected void Page_Load(object sender, EventArgs e) 
     { 
      RegisterDefaultButton(txtValue1, cmdSubmit1); 
      RegisterDefaultButton(txtValue2, cmdSubmit2); 

     } 

    </script> 

    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 
      Enter Value 1: <asp:TextBox ID="txtValue1" runat="server"></asp:TextBox> 
      <br /> 
      Enter Value 2: <asp:TextBox ID="txtValue2" runat="server"></asp:TextBox> 
      <br /> 
      <asp:Literal ID="litValue" runat="server"></asp:Literal> 
      <asp:LinkButton ID="cmdSubmit1" runat="server" Visible="false" OnClick="cmdSubmit1_Click">Hidden Button 1</asp:LinkButton> 
      <input id="cmdSubmit2" runat="server" visible="false" type="button" value="Hidden Button 2" onserverclick="cmdSubmit2_Click" /> 
     </form> 
    </body> 
+0

Me acabo de dar cuenta de que su código, con pequeñas modificaciones, simplemente es IGNORADO por IE8 mientras funciona en Firefox. ¿Podría ser debido al hecho de que TextBox es un gaia: TextBox de Gaia AJAX WebWidgets y aparece solo después de una devolución de datos? Comprobé dos veces que el HTML generado coincide con el del clic de un botón, y ni siquiera tuve que deshabilitar la validación de eventos (porque en FF funciona), pero todavía recibo una devolución de datos HTTP vacía (no AJAX como FF) –

+0

Eso es extraño. Si el javascript está allí, y parece que el javascript en el botón y el botón funciona, entonces uno pensaría que el script en el cuadro de texto debería tener el mismo resultado. Es posible que el cuadro de texto de gaia esté registrando un evento onKeyDown también y que esté causando que no llame al script en línea. Deberías probar el depurador de scripts y ver si el método dopostback realmente está siendo llamado. –

+0

Intentando usar esto ... Lo puse en funcionamiento reemplazando el evento onkeyevent con solo "if (event.keyCode == 13) {alert ('go');}" ... 'ir' cuadro de alerta aparece cada vez enter se hace clic. Pero cuando devuelvo el código original a la página, solo se actualiza y nunca se llama al evento de clic de LinkButton. ¿Algunas ideas? (Mi código es casi idéntico a su ejemplo, excepto que tengo solo un LinkButton al que están llamando ambos TextBoxes) Estoy probando esto en IE9. – cavillac

2

Usted podría intentar esto:

<html> 
<head> 
<script type="text/javascript"> 
function test(e){ 
var keynum; 

if(window.event) // IE 
{ 
keynum = e.keyCode 
} 
else if(e.which) // Netscape/Firefox/Opera 
{ 
keynum = e.which 
} 
if(keynum==13) __doPostback('yourButtonId', ''); 
} 
</script> 
</head> 
<body> 
<input type="text" onkeypress="test(event)" /> 
</body> 
</html> 

Tendrá que sustituir 'yourButtonId' con el identificador que se representa en el marcado de este botón, es decir, la propiedad ClientID en su. Código NETO La función __doPostback es la definida por .NET para manejar todas sus devoluciones.

3

Aquí es una manera más fácil funciona muy bien para ASP.NET:

Añadir esto en su página .aspx

<script type="text/javascript"> 
     function clickButton(e, buttonid) { 
      var evt = e ? e : window.event; 
      var bt = document.getElementById(buttonid); 
      if (bt) { 
       if (evt.keyCode == 13) { 
        bt.click(); 
        return false; 
       } 
      } 
     } 
</script> 

y añadir en el Page_Load en su aspx.archivo cs

textbox1.Attributes.Add("onkeypress", "return clickButton(event,'" + buttonName1.ClientID + "')"); 
Cuestiones relacionadas