2010-12-04 10 views
5

Mam następujący problem w ASP.NET: istnieje formularz, który zawiera pole tekstowe i przycisk obok niego, który ma być naciśnięty przez użytkownika po wypełnieniu pola (próbka na http://www.burnthespam.info, kliknij "Wybierz swoją" lub korzystając z ReCaptcha w wyskakującym okienku). Często zamiast tego użytkownicy naciskają przycisk ENTER, aby przesłać formularz.Obsługa przycisku ENTER w TextBox, ASP.NET

Nie powoduje to uruchomienia zdarzenia kliknięcia przycisku i może spowodować nieoczekiwane zachowanie. W "burnthespam" próbowałem rozwiązać problem, sprawdzając, czy w polu tekstowym znajdują się dane (ale teraz, jeśli zrobisz coś innego niż naciśnięcie klawisza), aby to obejść.

Wiesz, czy istnieje inny sposób obsłużyć przesyłanie formularza z ENTER klucza lub fragment kodu JavaScript, który po naciśnięciu ENTER naciśnie przycisk mi się podoba?

EDIT

Chcę obsłużyć zdarzenia klawisz ENTER na stronie serwera, tj. Mam już

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

chcę metoda na miano nie tylko wtedy, gdy przesłać formularz za pomocą przycisku (kliknij lub pomieszczenie wraz z nim podświetlone), ale również wtedy, gdy użytkownik naciśnie ENTER gdy skupienie pola tekstowego

EDIT 2

wiesz, jeśli to możliwe, aby programowo kliknij przycisk w JavaScript? Być może nie można zapobiec phishingowi/spamowaniu (na przykład Facebook i "udostępnij znajomym"), ale nadal chciałbym zapytać ...

Odpowiedz

0

Istnieje kilka sposobów ustawienia domyślnego przycisku za pomocą obiektu formularza Właściwość DefaultButton lub właściwość DefaultButton panelu, ale stwierdziłem, że nie są wiarygodne w przeszłości w różnych przeglądarkach, więc zazwyczaj polegam na javascript.

Jedyną wadą tego kodu jest wyłączenie sprawdzania poprawności zdarzeń za pomocą dyrektywy stronicowania, ale powinno ono uruchamiać zdarzenia kliknięcia i uruchamiać walidatory i tak dalej.

Oto przykład kodu, którego używamy. Normalnie umieściłbym funkcję rejestru w klasie narzędziowej, ale dla tego przykładu jest w kodzie strony. Wypróbuj to.

<%@ 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

Właśnie zauważyłem, że twój kod, z niewielkimi modyfikacjami, jest po prostu IGNOROWANY przez IE8 podczas pracy w Firefoksie. Czy może to wynikać z faktu, że TextBox to gaia: TextBox z Gai AJAX WebWidgets i pojawia się dopiero po odświeżeniu? Sprawdziłem dwukrotnie, czy wygenerowany kod HTML pasuje do tego dla kliknięcia przycisku, i nawet nie musiałem wyłączyć sprawdzania poprawności zdarzeń (ponieważ działa w FF), ale nadal otrzymuję pusty komunikat HTTP (nie AJAX jak FF) –

+0

To jest dziwne. Jeśli istnieje javascript i wygląda na to, że javascript na przycisku i przycisk działa, to można by pomyśleć, że skrypt w polu tekstowym powinien mieć taki sam wynik. Czy jest możliwe, że pole tekstowe gaia rejestruje zdarzenie onKeyDown, a to powoduje, że nie wywołuje on skryptu wbudowanego. Powinieneś wypróbować debuggera skryptu i sprawdzić, czy wywoływana jest metoda dopostback. –

+0

Próba użycia tego ... Mam to działa, zamieniając onkeyevent na "if (event.keyCode == 13) {alert ('go');}" ... "pojawia się okienko alertu" go "pojawia się za każdym razem enter jest kliknięty. Ale kiedy umieszczę oryginalny kod z powrotem na stronie, odświeża się, a zdarzenie kliknięcia LinkButton nigdy nie jest wywoływane. Jakieś pomysły? (Mój kod jest prawie identyczny z twoim przykładem, z wyjątkiem tego, że mam tylko jeden LinkButton, który wywołują oba TextBoxy). Testuję to w IE9. – cavillac

2

Można spróbować to:

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

Musisz zastąpić „yourButtonId” z identyfikatorem, który jest renderowane w znacznikach dla przycisku, czyli własności ClientID w twojej. Kod NET. Funkcja __doPbackback jest tą zdefiniowaną przez .NET do obsługi wszystkich jej postbacków.

3

Tutaj jest łatwiejszy sposób działa świetnie dla ASP.NET:

Dodaj to na swojej stronie .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> 

I dodać to na Page_Load w swojej aspx.cs file

textbox1.Attributes.Add("onkeypress", "return clickButton(event,'" + buttonName1.ClientID + "')"); 
Powiązane problemy