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?

Était-ce utile?

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
{
    //...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top