Revalider un ViewModel modifié dans un procédé de commande?
-
27-10-2019 - |
Question
EDIT - Nous utilisons MVC4 Dev Preview ....
Je mettre en œuvre une page d'édition pour une classe FishingTrip
. FishingTrip
contient une collection enfant d'objets Crew
simples (à savoir FishingTripID, CrewID, CrewPosition).
J'utilise approche de Jarrett Meyer pour ajouter, modifier et supprimer de la collection Crew
.
J'utilise la validation discrète pour spécifier que les propriétés de Crew
sont Required
.
Mon problème:. Quand je logiquement supprimer un élément de la liste (selon la méthode de Jarrett), je ne veux pas que l'article soit validé
J'ai peaufiné avec succès la méthode « removeRow » sur le côté client pour désactiver la validation discrète pour l'élément logiquement supprimé, de sorte que la forme affichera malgré l'existence d'un élément qui contient des champs vides.
Dans ma méthode contrôleur [HttpPost] Edit
, ModelState.IsValid
commence comme fausse (comme prévu -. À cause de l'élément logiquement supprimé qui contient des champs vides) Je supprimer cet élément de mon ViewModel .... mais ModelState.IsValid
est encore faux.
En résumé, je (crois que je) veux modifier mon ViewModel dans la méthode du contrôleur pour supprimer l'élément incriminé, puis appeler une sorte de « revalidate », et ont ModelState.IsValid
apparaître comme vrai.
Toutes les idées?
La solution
Une fois que vous avez supprimé l'article incriminé (s), videz à nouveau le ModelState et validate, comme suit:
ModelState.Clear();
TryValidateModel(crew); // assumes the model being passed is named "crew"
Remarque :. Attention quand la méthode de l'utilisation TryValidateModel
parce que cette méthode ne fait pas l'objet du modèle validate imbriqué (Comme mentionné par @Merenzo)
Autres conseils
Fin du jeu, mais quand même:
Je cherchais aussi un moyen de modèle validate après faire quelques modifications à elle (plus précisément - les éléments de sa collection imbriquée) - et TryValidateModel
ne fonctionnait pas pour moi, car il n'a pas traiter des objets imbriqués.
Enfin, je me suis installé avec un liant de modèle personnalisé:
public class MyItemModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(MyItemModel))
{
MyItemModel item = (MyItemModel)bindingContext.Model;
//do required tweaks on model here
//(I needed to load some additional data from DB)
}
//validation code will be called here, in OnModelUpdated implementation
base.OnModelUpdated(controllerContext, bindingContext);
}
}
sur la classe modèle:
[ModelBinder(typeof(MyItemModelBinder))]
public class MyItemModel : IValidatableObject
{
//...
}