2011-02-07 3 views
2

Bonjour à tous. Je me demandais s'il y avait de toute façon que le framework MVC câble automatiquement les attributs data-val * sur les contrôles ou devons-nous créer manuellement et appliquer les attributs au contenu dynamique?Contrôles dynamiques ASP.NET MVC 3 et validation discrète

J'ai une vue qui appelle initialement une vue partielle passant dans le modèle de vue principal. Cette vue partielle est liée à une propriété complexe sur mon modèle principal. La vue partielle contient simplement un ensemble de listes déroulantes en cascade. Au chargement initial de la page, j'ai un appel à @Html.Partial("PartialName", Model), la validation des deux listes déroulantes fonctionne parfaitement si j'essaie de soumettre sans sélectionner les bonnes valeurs. J'ai également un autre bouton sur la page qui, s'il est cliqué, charge une autre instance de la vue partielle sur la page. Si j'essaie maintenant de soumettre le formulaire à ces contrôles, bien qu'ils soient liés au même modèle et bien que j'ai défini les correcteurs .ValidationMessageFor, aucune validation n'apparaît pour eux car les listes déroulantes ne semblent pas être générées avec les attributs data-val * . Y a-t-il un moyen de les faire apparaître correctement? J'ai également remarqué que la balise associée <span /> associée au .ValidationMessageFor n'est pas générée non plus. Quelqu'un a-t-il également rencontré ce problème? Si oui, comment avez-vous résolu ce problème?

MISE À JOUR

Voici la fonction javascript que j'appelle pour charger la partie sur l'événement onClick du bouton:

function AddNewVehicle() { 
$.ajax({ 
     type: 'GET', 
     url: '/ReservationWizard/AddVehicleToReservation', 
     data: $('#reservation-wizard-form').serialize(), 
     dataType: 'HTML', 
     async: true, 
     success: function (data) { 
      if (data != null) { 
       $('#vehicle-selection-container').append(data); 
      } 
     } 
    }); 
} 

Répondre

7

Le problème est que si vous n'êtes pas dans un contexte de forme, la Les helpers HTML tels que TextBoxFor ne génèrent pas d'attributs de validation de client *. La première fois que la page se charge, vous appelez votre Html.RenderPartial à l'intérieur d'un Html.BeginForm() mais plus tard lorsque vous utilisez AJAX pour ajouter des éléments de formulaire, il n'y a plus ce contexte de formulaire et aucun attribut de validation client data-* ne sera généré. Une solution possible serait de mettre le formulaire à l'intérieur du partiel puis de mettre à jour le formulaire entier pendant l'appel AJAX et dans le rappel de succès, de re-analyser les règles de validation client en utilisant $.validator.unobtrusive.parse('#vehicle-selection-container').

Mais si vous ne voulez garder qu'un seul élément à l'intérieur du partiel, vous êtes à peu près seul :-) Voici un blog post qui couvre votre scénario que vous pourriez jeter un oeil. Donc, que puis-je dire: la validation discrète des clients est excellente sur le papier et les articles de blog de Scott Gu, mais à un certain stade du développement des applications du monde réel, les gens commencent à se rendre compte de ses limites. C'est l'une des raisons pour lesquelles j'utilise directement le plugin jquery.validate et pas de MS jquery.unobtrusive. Et, oui je sais que je répète ma logique de validation de serveur dans le javascript et oui je m'en fous car j'ai un contrôle total. Oh, et sur le serveur j'utilise FluentValidation.NET au lieu des annotations de données pour à peu près les mêmes raisons que la partie côté client :-)

Alors peut-être un jour dans MVC 4 Microsoft va enfin faire une bonne validation (impératif vs déclaratif) mais jusqu'à ce que ce jour arrive, nous devons juste chercher des solutions de contournement.

+0

Auriez-vous un exemple de la façon dont vous l'implémentez en utilisant la pile de bibliothèques mentionnée ci-dessus? Juste pour que je puisse avoir une idée du travail que cela implique dans mon projet. Je vous remercie. – mreyeros

+0

@mreyeros, malheureusement je n'ai pas un échantillon complet que je pourrais partager dans le domaine public avec tous les concepts. Mais pour la logique de validation côté serveur, FluentValidation.NET a une [excellente documentation] (http://fluentvalidation.codeplex.com/documentation) et une excellente [intégration avec ASP.NET MVC] (http://fluentvalidation.codeplex.com/ wikipage? title = mvc & referencedTitle = Documentation).Une fois la logique de validation côté serveur exécutée, la validation côté client consiste à suivre la documentation [jquery validate plugin] (http://docs.jquery.com/Plugins/Validation). –

+0

Et évidemment, si vous rencontrez des difficultés à mettre en œuvre certains des concepts, vous ne devriez pas hésiter à montrer votre code sur SO et à expliquer les problèmes que vous avez rencontrés et vous aurez certainement de l'aide. –

Questions connexes