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.