2010-08-06 10 views
7

Mi sento come se avessi fatto questo scenario un sacco di volte, e di solito funziona, quindi ovviamente mi manca qualcosa.ASP.NET/JavaScript - Perché "Return False" non impedisce il postback?

Ecco il mio lato server Button ASP.NET:

<asp:Button ID="btnFoo" runat="server" Text="Foo" CssClass="button foo" OnClientClick="foo_Click();" /> 

che vengono sta rendering sul client come:

<input type="submit" name="reallylongclientid" value="Foo" onclick="foo_Click();WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(reallylongclientidandpostbackoptions, false, false))" id="reallylongclientid" class="button foo"> 

Nessuna sorpresa là.

ecco la sorpresa, nella mia funzione JavaScript:

function foo_Click() { 
    return false; 
} 

Va bene così ci sono più ad esso che quello, ma ho tagliato verso il basso per dimostrare un punto.

Quando faccio clic sul pulsante, chiama la funzione lato client e restituisce false.

Ma torna ancora al server, perché?

Io fondamentalmente voglio fare questo sul click del pulsante:

  1. Do convalida lato client.
  2. Se la convalida è superata, postback
  3. In caso contrario, visualizzare alcuni messaggi di errore nel modulo.

Naturalmente, potrei cambiare questo ad un pulsante sul lato client (type = "button" ingresso) e manualmente kick off il postback quando voglio, ma non avrei bisogno di farlo. O dovrei?

risposta

17

scrittura return dichiarazione in modo che quando si fa clic su pulsante esso return false che non permettono di inviare il modulo

<asp:Button ID="btnFoo" runat="server" Text="Foo" CssClass="button foo" 
OnClientClick="return foo_Click();" /> 
+0

sapeva che era ovvio (schiaffi testa). Grazie. – RPM1984

+0

Ho appena notato che se faccio "var passedValidation = new Boolean (false); return passedValidation" viene ancora postato. Ma se lo restituisco falso, non lo è. WTF? qualche idea? – RPM1984

+0

@ RPM1984: Usando il costruttore 'Boolean', con la parola chiave 'new', crea un oggetto' Boolean' * object wrapper *, e in JavaScript qualsiasi oggetto è considerato * truthy * quando viene usato nel contesto booleano, ad esempio: ' !! new Boolean (false) '==>' true', ti consiglio di usare semplicemente i valori letterali boolean 'true' o' false', che rappresentano valori direttamente primitivi ... – CMS