2010-08-06 5 views
7

J'ai l'impression d'avoir fait ce scénario de nombreuses fois, et cela fonctionne généralement, donc je manque évidemment quelque chose.ASP.NET/JavaScript - Pourquoi "ne pas retourner" ne prévient-il pas la publication?

Voici mon côté serveur ASP.NET Button:

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

qui get rendu sur le client:

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

Pas de surprise là-bas.

est ici la surprise, dans ma fonction JavaScript:

function foo_Click() { 
    return false; 
} 

Ok donc il y a plus que ça, mais je l'ai coupé vers le bas pour prouver un point. Lorsque je clique sur le bouton, il appelle la fonction côté client et renvoie false.

Mais il publie toujours sur le serveur, pourquoi?

Je veux essentiellement faire sur le clic du bouton:

  1. Do validation côté client.
  2. Si la validation réussit, renvoyer
  3. Si ce n'est pas le cas, affichez certains messages d'erreur sur le formulaire.

Bien sûr, je pourrais changer cela à un bouton côté client (input type = « button ») et manuellement coup d'envoi du postback quand je veux, mais je ne devrais pas avoir besoin de le faire. Ou devrais-je?

Répondre

17

écrire return déclaration ainsi lorsque vous cliquez sur le bouton, il return false qui permettent de ne pas soumettre le formulaire

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

Knew il était évident (tête de claques). Merci. – RPM1984

+0

Je viens de remarquer que si je fais "var passedValidation = new Boolean (false); return passedValidation" il continue à poster. Mais si je fais juste revenir faux, il doesnt. WTF? des idées? – RPM1984

+0

@ RPM1984: L'utilisation du constructeur 'Boolean', avec le mot clé' new', crée un wrapper d'objet 'Boolean' *, et en JavaScript tout objet est considéré comme * truthy * lorsqu'il est utilisé dans un contexte booléen, par exemple:' !! new Boolean (false) '==>' true', je vous recommande d'utiliser simplement les littéraux booléens 'true' ou' false', qui représentent directement les valeurs primitives ... – CMS

Questions connexes