17

je la vue suivante dans ASP.net MVC 3:ASP.net MVC Validation Crochet

@model Models.CreateProjectViewModel 

<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script> 
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script> 

@using(Html.BeginForm()) { 
    @Html.TextBoxFor(m => m.ProjectName) 
    @Html.ValidationMessageFor(m => m.ProjectName) 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 
} 

J'utilise javascript discret avec jQuery et le cadre de validation Fluent.

Lorsque je clique sur le bouton Enregistrer et que la validation échoue, y a-t-il un événement auquel je peux me connecter pour appeler du javascript personnalisé?

function validationFailed() { 
    // do something here only if validation failed 
} 

Comment pourrais-je attacher dans la validation de telle sorte que quand il a échoué (et seulement si elle a échoué) je pourrais appeler ma fonction validationFailed().

+0

Qu'essayez-vous exactement de faire? Je sais que vous voulez exécuter du javascript si cela échoue, mais qu'est-ce que vous essayez d'accomplir en faisant cela? –

Répondre

3

Vous pouvez utiliser le invalidHandler, je crois que c'est dans la validation jquery.

invalidHandler Callback
callback pour un code personnalisé lorsqu'une forme non valide est soumis. Appelé avec un objet événement en tant que premier argument et le validateur en tant que seconde.

+0

Si j'utilise Data Annotations ou Fluent Validation, cela va-t-il m'empêcher de créer un gestionnaire de validation selon moi? – Dismissile

+0

Ce sera juste un rappel qui est déclenché lorsque le formulaire soumis est invalide. Toutes les validations que vous créez via des annotations de données, etc. fonctionneront normalement. –

+0

Cela ne fonctionne pas. Lorsque j'ajoute validate() à mon formulaire, il est simplement ignoré. Je pense qu'il y a un conflit entre mon gestionnaire de validation créé par les annotations de données et celui que j'essaie d'ajouter manuellement. – Dismissile

35

Comme jQuery/validation docs dit, vous pouvez utiliser invalidHandler réagir lorsqu'une forme non valide est soumis. Mais comme la validation discrète de MVC instancie la validation elle-même, vous devez accrocher cet événement plus tard.

En utilisant exactement le même mécanisme que jQuery/Validation: vous pouvez lier votre code à l'événement personnalisé des éléments de formulaire 'invalid-form.validate', ce qui correspond à invalidHandler!

$(document).ready(function() { 
    $('#myform').bind('invalid-form.validate',function(){ 
     alert('invalid form!'); 
    }); 
}); 

pour donner votre formulaire une utilisation id:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myform" })) { 
} 

Mise à jour:

Une autre façon d'obtenir l'objet de validation existante appelle validate() Sur le formulaire. Si un validateur pour ce formulaire a déjà été créé, il sera retourné:

Edit: après l'initialisation est survenue, le changement .settings.invalidHandler est trop tard pour la liaison. L'extrait suivant ne fonctionnera donc plus si vous ne réinitialisez pas le validateur.

$(document).ready(function() { 
    var existingValdiation = $("#myform").validate(); 
    //the settings property corresponds to the options parameter 
    existingValdiation.settings.invalidHandler = function (form) { 
     alert('invalid form!'); 
    }; 
    // not recommended: 
    // re-init would bind settings.invalidHandler to 'invalid-form.validate' 
    // existingValdiation.init(); 
}); 
+0

La première option a bien fonctionné! :) –

+0

Merci. La première option était parfaite pour moi. = -) –

+0

Première option travaillée. Deuxième n'a pas. Devrait modifier alternative ou le supprimer? Merci pour le premier. –