J'ai des problèmes pour essayer de faire fonctionner la validation discrète de jquery avec une vue partielle chargée dynamiquement via un appel AJAX.
J'ai passé des jours à essayer de faire fonctionner ce code sans succès.
Voici la vue:
@model MvcApplication2.Models.test
@using (Html.BeginForm())
{
@Html.ValidationSummary(true);
<div id="res"></div>
<input id="submit" type="submit" value="submit" />
}
La vue partielle:
@model MvcApplication2.Models.test
@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);
<script type="text/javascript" >
$.validator.unobtrusive.parse(document);
</script>
Le modèle:
public class test
{
[Required(ErrorMessage= "required field")]
public int MyProperty { get; set; }
}
Le controlle:
public ActionResult GetView()
{
return PartialView("Test");
}
et enfin, le javascript:
$(doument).ready(function () {
$.ajax({
url: '/test/getview',
success: function (res) {
$("#res").html(res);
$.validator.unobtrusive.parse($("#res"));
}
});
$("#submit").click(function () {
if ($("form").valid()) {
alert('valid');
return true;
} else {
alert('not valid');
return false;
}
});
La validation ne fonctionne pas. Même si je ne remplis aucune information dans la texbox, l'événement submit affiche l'alerte («valide»).
Cependant, si au lieu de charger dynamiquement la vue, j'utilise @Html.Partial("test", Model)
pour rendre la vue partielle dans la vue principale (et je ne fais pas l'appel AJAX), alors la validation fonctionne très bien.
C'est probablement parce que si je charge le contenu dynamiquement, les contrôles n'existent pas encore dans le DOM. Mais je fais un appel $.validator.unobtrusive.parse($("#res"));
qui devrait être suffisant pour laisser le validateur sur les contrôles nouvellement chargés ...
Quelqu'un peut-il aider?
unobtrusive.parse
fonction prend un sélecteur comme argument, pas comme élément.Réponses:
Si vous essayez d'analyser un formulaire qui est déjà analysé, il ne sera pas mis à jour
Ce que vous pouvez faire lorsque vous ajoutez un élément dynamique au formulaire est soit
Vous pouvez supprimer la validation du formulaire et le valider à nouveau comme ceci:
Accédez aux
unobtrusiveValidation
données du formulaire en utilisant ladata
méthode jquery :puis accédez à la collection de règles et ajoutez les nouveaux attributs d'éléments (ce qui est un peu compliqué).
Vous pouvez également consulter cet article sur l' application d'une validation jquery discrète au contenu dynamique dans ASP.Net MVC pour un plugin utilisé pour ajouter des éléments dynamiques à un formulaire. Ce plugin utilise la 2ème solution.
la source
$("form").data("validator").settings
seront supprimés$(formSelector).removeData("validator")
et remplacés par les paramètres par défaut$.validator.defaults
lors de la nouvelle analyse du formulaire. C'est un excellent moyen d'inclure des champs dynamiques, mais assurez-vous de répéter tout code d'initialisation personnalisé à chaque nouvelle analyse.En complément de la réponse de Nadeem Khedr ...
Si vous avez chargé un formulaire dans votre DOM de manière dynamique, puis appelez
(avec les bits supplémentaires mentionnés) et vont ensuite soumettre ce formulaire en utilisant ajax n'oubliez pas d'appeler
qui renvoie vrai ou faux (et exécute la validation réelle) avant de soumettre votre formulaire.
la source
ajoutez ceci à votre _Layout.cshtml
la source
Étonnamment, lorsque j'ai lu cette question, les documents officiels ASP.NET ne contenaient toujours aucune information sur la
parse()
méthode discrète ou sur la façon de l'utiliser avec du contenu dynamique. J'ai pris la liberté de créer un problème dans le référentiel docs (en référence à la réponse originale de @ Nadeem) et de soumettre une demande de tirage pour le résoudre. Ces informations sont désormais visibles dans la section de validation côté client de la rubrique de validation de modèle.la source
tester ceci:
la source
J'ai été frappé dans le même problème et rien n'a fonctionné sauf ceci:
et ajouter
où vous essayez d'enregistrer le formulaire.
J'enregistrais le formulaire via un appel Ajax.
J'espère que cela aidera quelqu'un.
la source
recopiez simplement ce code à la fin du code modal
;)
la source