2011-09-29 3 views
0

Le formulaire contient un élément d'entrée. La valeur entrée est validée à l'aide du rappel du serveur à partir du flou événement andler.Comment effectuer une validation côté serveur avant de soumettre

Si une valeur incorrecte est entrée et que le bouton d'envoi est enfoncé, le formulaire est soumis avec une valeur incorrecte: La méthode de validation n'est pas terminée mais la méthode d'action d'envoi de formulaire est exécutée.

Comment forcer la méthode Validate() pour être terminée avant l'exécution de la méthode de soumission de formulaire?

jquery, jqueryUI, ASP .NET MVC2 sont utilisés.

<form id="Form" class='form-fields' method='post' action='/Report/Render'> 
    <input id='test' name='test' value='test' /> 
    <input id='_submit' type='submit' value='Show report' /> 
</form> 

    $('#test').bind({ 
     blur: function (e) { 
      if (!Validate(e.target)) { 
       cancel(e); 
      } 
     } 
    }); 

Mise à jour

Comme nécessaire commentaire BobTodd ici est de valider la méthode:

function Validate(elem) { 
var i, 
    res; 
$.ajax('Grid/Validate'); 
    { 
     data: $("#Form").serializeArray(), 
     //async: false, 
     type: 'POST', 
     error: function (jqXHR, textStatus, errorThrown) { 
      elem.skipBlur = true; 
      errorMessage(decodeErrorMessage(jqXHR.responseText === undefined ? '' : jqXHR.responseText, 
         textStatus, errorThrown)); 
      elem.focus(); 
      elem.select(); 
      elem.skipBlur = false; 
      elem.ischanged = true; 
      res = false; 
     }, 
     success: function (data) { 
      elem.ischanged = false; 
      for (i = 0; i < data.length; i += 1) { 
       $('#' + data[i].name).val(data[i].value); 
      } 
      res = true; 
     } 
    }); 
return false; // res; 

}

Update2

Al Les réponses suggèrent d'empêcher l'exécution de la méthode submit si la validation n'est pas effectuée. Cela donne une très mauvaise expérience utilisateur: valider prend du temps. L'utilisateur doit appuyer sur deux fois dans le bouton Envoyer pour que le formulaire soit envoyé. Comment permettre au formulaire de soumettre en utilisant un seul clic? Maksing Valider() méthode de synchronisation alllws cela mais je ne suis pas sûr utilise l'appel de synchronisation solution raisonnable pour cela.

+0

où est le rappel du serveur ici? Où est la fonction Validate (objet) que vous avez là? –

+0

@BobTodd: J'ai mis à jour la question et ajouté la méthode de validation appelée dans l'échantillon de code – Andrus

Répondre

0

Vous devrez réexécuter la méthode Validate sur le formulaire submit et l'annuler là.

Regardez le plugin jQuery Validate, il supporte les méthodes de validation remove qui fonctionnent super facilement avec mvc.

http://bassistance.de/jquery-plugins/jquery-plugin-validation/

http://docs.jquery.com/Plugins/Validation/Methods/remote#options

+0

merci. jquery validate plugin remote() permet d'appeler la méthode côté serveur avant de soumettre. Le formulaire contient des éléments d'entrée may validés par le serveur à partir d'un événement de flou. Comment valider uniquement l'élément qui perd le focus si le bouton Soumettre est cliqué. La validation met à jour certains champs afin que le serveur appelant pour chaque champ ne soit pas possible, seul le champ modifié doit être validé. Comment mettre en œuvre cela? Je mets à jour la question. – Andrus

+0

Vous n'êtes pas obligé de le faire. Le plugin est assez intelligent pour valider uniquement les champs qui ont changé depuis la dernière validation. – BNL

+0

Deux ussues: 1) Comme indiqué dans l'exemple de code, j'ai besoin de mettre à jour d'autres champs si la validation est OK. Par exemple, après avoir validé le nom du produit du code de produit, le prix et la quantité en stock doivent également être mis à jour. La méthode remote() nécessite un validateur distant pour renvoyer uniquement true en cas de succès. Comment obtenir la liste des paires nom/valeur renvoyées par le validateur distant? 2) Comment passer tous les champs de formulaire au validateur distant? d'après doc distant, seule la valeur actuelle du champ est transmise. – Andrus

0

suffit de désactiver le bouton d'envoi jusqu'à ce que la validation est terminée.

+0

Dans ce cas, l'utilisateur voit le bouton d'envoi actif et clique dessus. Après que l'événement de flou d'élément d'entrée désactive le bouton de soumission. Vous n'êtes pas sûr que cela empêche l'envoi d'un événement puisque le bouton est déjà cliqué. De toute façon, cela ressemble à une mauvaise expérience utilisateur: cliquez sur soumettre est ignoré, l'utilisateur doit cliquer à nouveau. Il devrait être préférable que submit soit exécuté après la fin de la validation. Comment mettre en œuvre cela? – Andrus

0

Wouldnt vous mieux servi de liaison qui jquery à l'événement de présenter le formulaire au lieu autrement son juste au moment où l'utilisateur quitte la zone de texte ...

$('.form-fields').bind({ 
     submit: function (e) { 
      if (!Validate(e.target)) { 
       cancel(e); 
      } 
     } 
    }); 
+0

Valider est la méthode asynchrone, elle renvoie immédiatement sans attendre le résultat du serveur. Ainsi, votre exemple de code réussit toujours ou bloque toujours l'envoi en fonction du résultat renvoyé par Validate(). Votre exemple fonctionne si Validate tel que modifié pour effectuer l'appel de synchronisation comme indiqué dans les commentaires dans le code valudate dans la réponse mise à jour. Je ne suis pas sûr si le changement de valider pour effectuer l'appel de synchronisation est raisonnable, jquery docs avertissent de ne pas faire des appels syns. – Andrus

0

Lorsque vous validez un champ, ajoutez une classe à valid l'élément si c'est valide. Ensuite, lors de la soumission du formulaire, vérifiez simplement si tous les champs ont cette classe:

$('#Form').submit(funciton(e){ 
    $(this).find('input').length == $(this).find('input.valid').length || e.preventDefault(); 
}); 
$('#Form input').bind({ 
    blur: function (e) { 
     if(Validate(e.target)) 
      $(e.target).addClass('valid'); 
     else 
      $(e.target).removeClass('valid'); 
    } 
}); 
+0

Votre code nécessite l'utilisateur d'appuyer deux fois pour soumettre le bouton pour soumettre le formulaire. Dans la première presse, la validation est en cours et la soumission est toujours annulée. J'ai mis à jour la question. Comment soumettre un formulaire en un seul clic? – Andrus

Questions connexes