J'ai une vue partielle qui est rendue dans une vue principale. La vue partielle tire parti de System.ComponentModel.DataAnnotations
et Html.EnableClientValidation()
.
Un lien est cliqué, et div contenant la vue partielle est affiché dans un JQuery.Dialog()
.
Je clique ensuite sur le bouton Enregistrer sans entrer de texte dans mon champ de saisie validé. La validation côté client est alors déclenchée comme prévu et le message "* requis" est affiché en regard du champ non valide.
Lorsque vous cliquez sur le bouton d'annulation, je souhaite rétablir la valeur par défaut de la validation MVC côté client et supprimer tous les messages, prêts à être ouverts lorsque l'utilisateur ouvrira à nouveau la boîte de dialogue. Y a-t-il un moyen recommandé de faire cela?
Cette réponse est pour MVC3. Voir les commentaires ci-dessous pour obtenir de l'aide pour mettre à jour MVC 4 et 5
Si vous voulez juste effacer les messages de validation afin qu'ils ne soient pas montrés à l'utilisateur, vous pouvez le faire avec javascript comme ceci:
function resetValidation() {
//Removes validation from input-fields
$('.input-validation-error').addClass('input-validation-valid');
$('.input-validation-error').removeClass('input-validation-error');
//Removes validation message after input-fields
$('.field-validation-error').addClass('field-validation-valid');
$('.field-validation-error').removeClass('field-validation-error');
//Removes validation summary
$('.validation-summary-errors').addClass('validation-summary-valid');
$('.validation-summary-errors').removeClass('validation-summary-errors');
}
Si vous avez besoin de réinitialiser pour ne fonctionner que dans votre popup, vous pouvez le faire comme ceci:
function resetValidation() {
//Removes validation from input-fields
$('#POPUPID .input-validation-error').addClass('input-validation-valid');
$('#POPUPID .input-validation-error').removeClass('input-validation-error');
//Removes validation message after input-fields
$('#POPUPID .field-validation-error').addClass('field-validation-valid');
$('#POPUPID .field-validation-error').removeClass('field-validation-error');
//Removes validation summary
$('#POPUPID .validation-summary-errors').addClass('validation-summary-valid');
$('#POPUPID .validation-summary-errors').removeClass('validation-summary-errors');
}
J'espère que c'est l'effet que vous recherchez.
Si vous utilisez une validation non intrusive fournie avec MVC, vous pouvez simplement faire:
$.fn.clearErrors = function () {
$(this).each(function() {
$(this).find(".field-validation-error").empty();
$(this).trigger('reset.unobtrusiveValidation');
});
};
---------------------------------------------------- ------------------------
Modification par une tierce partie : Cela fonctionnait généralement dans mon cas, mais je devais supprimer la ligne $(this).find(".field-validation-error").empty();
. Cela semble affecter la ré-affichage des messages de validation lors de la resoumission.
J'ai utilisé ce qui suit:
$.fn.clearErrors = function () {
$(this).each(function() {
$(this).trigger('reset.unobtrusiveValidation');
});
};
et ensuite appelé comme ça:
$('#MyFormId input').clearErrors();
function resetValidation() {
$('.field-validation-error').html("");
}
Je vous remercie. J'avais une question similaire pour un scénario légèrement différent. J'ai un écran où, lorsque vous cliquez sur l'un des boutons de soumission, il télécharge un fichier. Dans MVC, lorsque vous renvoyez un fichier à télécharger, les écrans ne sont pas basculés. Par conséquent, les messages d'erreur déjà présents dans le récapitulatif de validation y restent indéfiniment. Je ne veux certainement pas que les messages d'erreur y restent après la nouvelle soumission du formulaire. Mais je ne veux pas non plus effacer les validations au niveau du champ qui sont capturées côté client lorsque le bouton de soumission est cliqué. De plus, certains de mes points de vue ont plus d’une forme.
J'ai ajouté le code suivant (merci à vous) au bas de la page Site.Master pour qu'il s'applique à toutes mes vues.
<!-- This script removes just the summary errors when a submit button is pressed
for any form whose id begins with 'form' -->
<script type="text/javascript">
$('[id^=form]').submit(function resetValidation() {
//Removes validation summary
$('.validation-summary-errors').addClass('validation-summary-valid');
$('.validation-summary-errors').removeClass('validation-summary-errors');
});
</script>
Merci encore.
Vous pouvez faire appel aux méthodes de la bibliothèque de validation pour le faire. Il y a deux objets d’intérêt: FormContext
et FieldContext
. Vous pouvez accéder à FormContext
via la propriété __MVC_FormValidation
du formulaire et à une FieldContext
par propriété validée via la propriété FormContext
's fields
.
Donc, pour effacer les erreurs de validation, vous pouvez faire quelque chose comme ceci avec un form
:
var fieldContexts = form.__MVC_FormValidation.fields;
for(i = 0; i < fieldContexts.length; i++) {
var fieldContext = fieldContexts[i];
// Clears validation message
fieldContext.clearErrors();
}
// Clears validation summary
form.__MVC_FormValidation.clearErrors();
Ensuite, vous pouvez rattacher ce morceau de code à l'événement dont vous avez besoin.
Sources pour cet aperçu (assez non documenté):
Vous pouvez simplement définir une nouvelle fonction dans jQuery:
$.fn.resetValidation = function () {
$(this).each(function (i, e) {
$(e).trigger('reset.unobtrusiveValidation');
if ($(e).next().is('span')) {
$(e).next().empty();
}
});
};
puis utilisez-le pour vos champs de saisie:
$('#formId input').resetValidation();
Afin de supprimer les artefacts de validation, y compris le message, l’arrière-plan coloré du champ de saisie et le contour coloré autour du champ de saisie, je devais utiliser le code suivant, où il s’agissait (dans mon cas) d’un dialogue modal Bootstrap une forme incrustée.
$(this).each(function () {
$(this).find(".field-validation-error").empty();
$(this).find(".input-validation-error").removeClass("input-validation-error");
$(this).find(".state-error").removeClass("state-error");
$(this).find(".state-success").removeClass("state-success");
$(this).trigger('reset.unobtrusiveValidation');
});