102 votes

la validation discrète ne fonctionne pas avec le contenu dynamique

J'ai des difficultés à faire fonctionner la validation jquery discrète avec une vue partielle chargée dynamiquement par 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 contrôleur :

    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 boîte de texte, l'événement submit affiche l'alerte ('valid').

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")); ce qui devrait suffire à informer le validateur des contrôles nouvellement chargés...

Quelqu'un peut-il m'aider ?

3voto

OmidRH Points 216

Teste ça :

if ($.validator.unobtrusive != undefined) {
    $.validator.unobtrusive.parse("form");
}

1voto

Naresh Parmar Points 123

J'ai également eu le même problème, mais dans mvc 2.

Je passe par l'étape par étape comme :

http://weblogs.asp.net/imranbaloch/archive/2010/07/11/asp-net-mvc-client-side-validation-with-dynamic-contents.aspx

Cela pourrait également vous aider.

http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx

J'espère que cela vous aidera :)

0voto

Il suffit de recopier ce code à la fin du code modal.

    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X