33 votes

Revalider un ViewModel modifié dans une méthode de contrôleur ?

EDIT - Nous utilisons MVC4 Dev Preview.....

Je suis en train de mettre en place une page d'édition pour un FishingTrip classe. FishingTrip contient une collection enfant de simples Crew (c'est-à-dire FishingTripID, CrewID, CrewPosition).

J'utilise L'approche de Jarrett Meyer pour ajouter, modifier et supprimer de la Crew collection. J'utilise une validation discrète pour spécifier que les propriétés de la collection Crew sont tous Required .

Mon problème : lorsque je supprime logiquement un élément de la liste (selon la méthode de Jarrett), je ne veux pas que cet élément soit validé.

J'ai réussi à modifier la méthode "removeRow" du côté client pour désactiver la validation discrète de l'élément logiquement supprimé, de sorte que le formulaire s'affiche malgré l'existence d'un élément contenant des champs vides.

Dans la méthode de mon contrôleur [HttpPost] Edit , ModelState.IsValid commence par être faux (comme prévu - à cause de l'élément logiquement supprimé qui contient des champs vides). Je supprime donc cet élément de mon ViewModel.... mais ModelState.IsValid est toujours fausse.

En résumé, je (pense) vouloir modifier mon ViewModel dans la méthode du contrôleur pour supprimer l'élément incriminé, puis appeler une sorte de "revalidation", et avoir ModelState.IsValid apparaissent comme vraies.

Des idées ?

74voto

counsellorben Points 7865

Une fois que vous avez supprimé le ou les éléments incriminés, effacez le ModelState et validez à nouveau, comme suit :

ModelState.Clear();
TryValidateModel(crew);  // assumes the model being passed is named "crew"

Note : Soyez prudent lors de l'utilisation TryValidateModel car cette méthode ne valide pas les objets imbriqués du modèle (comme mentionné par @Merenzo).

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