2009-05-01 20 views
5

ASP.NET 2.0, test in FF3 e IE7.TextBox causa il postback del pulsante in ASP.NET

Quando si preme il pulsante "Invio" da una casella di testo, viene attivato l'evento "OnClick" corrispondente per il primo ImageButton nella pagina. Se rimuovo quel pulsante immagine, si attiva il prossimo evento ImageButton OnClick sulla pagina.

Dalla console FireBug, se utilizzo JavaScript per inviare il modulo, ciò non accade. Ma per qualsiasi motivo, premendo Invio dalla casella di testo si attiva l'evento ImageButton non correlato.

Ho trovato this question che ha avuto un problema simile, tuttavia la risposta proposta a tale soluzione non funziona poiché ImageButtons non ha una proprietà "UseSubmitBehavior" su di essi.

Non capisco perché questo evento stia sparando. Se guardo Request.Form, posso vedere che __EVENTTARGET è vuoto, e in effetti sta postando l'intero contenuto del modulo (tutte le mie caselle di testo), ma include anche coppie di chiavi/valori imageButton.xe imageButton.y.

Perché è questo? Suppongo di poter rilevare "digita" i tasti da queste caselle di testo con javascript, ma la mia esperienza in passato è che questo comportamento è altamente variabile tra i browser. Eventuali suggerimenti?

risposta

3

Si potrebbe provare a impostare un pulsante predefinito in un pannello di asp o sul modulo. Questo ti permetterà di controllare cosa succede quando un utente preme il tasto Invio.

+4

Ho finito per aggiungere un nuovo asp: pulsante senza evento onclick e impostalo per non visualizzare nessuno. Sembrava più pulito di una soluzione JS per il rilevamento della chiave di invio. – Matt

0

Il comportamento predefinito per un pulsante di invio consente di premere in un'area non di testo per postback di un modulo. Dovresti gestirlo in un metodo javascript per fermare il postback.

Faresti solo bisogno di controllare la proprietà window.event.keyCode per vedere se uguale a 13. Se lo è, ripristinarlo a 0.

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

'window.event' non esiste in FF3. – robertc

0

Suppongo che ho potuto rilevare " inserisci "tasti premuti da queste caselle di testo con javascript

Questo è quello che ho fatto per aggirare questo comportamento e funziona benissimo in IE7 e FF3. È solo un po 'innaturale.

Ecco un Esempio generico:

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); 
    } 

ho usato WebForm_DoPostBackWithOptions perché avevo bisogno validatori per innescare. Altrimenti, potresti voler usare __DoPostBack.

Qui ci sono i "prototipi":

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) 

Speranza che aiuta.

P.S .: Ho usato JQuery qui ma $ get sarebbe lo stesso.

1

È possibile disattivare il tasto Invio dalla pressione, quindi l'utente dovrà fare clic sui propri ImageButtons.Basta incollare questo blocco javascript sulla tua pagina:

<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

ecco una soluzione più elegante

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

leggere l'intero post here

0

Ecco una soluzione elegante che ho trovato, nel caso in cui nessuno altrimenti ha questo problema (nel caso tutte le altre soluzioni non funzionino per te, dato che non funzionavano per me):

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

La casella di testo iself era dentro l'ul (generato da JavaScript).
Premendo invio si attiverà "doNothingButton", che restituirà false sul lato client, causando alcun postback a tutti!

1

Recentemente, ho fatto di più sul client con servizi Web e meno postback. Spostando i miei controlli all'esterno dell'elemento del modulo (o eliminandolo del tutto), il problema scompare. È inserito di default nelle pagine di aspx, ma non mi è venuto in mente fino a poco tempo fa che non ne ho bisogno per gran parte di quello che faccio.

3

Sto avendo lo stesso problema sul mio progetto.

Questo problema è causato perché ASP.NET sempre assumerà che il primo elemento che eredita da IButton interfaccia (Button e ImageButton) è il pulsante predefinito dalla pagina.

Hipoteticaly, se si utilizza un LinkButton anziché Button o ImageButton, questo problema è risolto.

Potete trovare ulteriori informazioni here on MSDN.