ModelState.IsValid = = false, why?

Où puis-je trouver la liste des erreurs qui rendent le ModelState invalide? Je n'ai vu aucune propriété d'erreur sur L'objet ModelState.

90
demandé sur Dan Beaulieu 2009-11-24 20:16:44

8 réponses

About "can it be that 0 errors and IsValid = = false": voici le code source MVC de https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41

public bool IsValid {
    get {
        return Values.All(modelState => modelState.Errors.Count == 0);
    }
}

maintenant, on dirait que c'est impossible. Eh bien, c'est pour ASP.NET MVC v1.

34
répondu queen3 2016-12-29 18:11:49

comme vous programmez probablement dans Visual studio, vous feriez mieux de profiter de la possibilité d'utiliser des points d'arrêt pour des étapes de débogage aussi faciles (obtenir une idée de ce qu'est le problème comme dans votre cas). Il suffit de les placer juste en face / à l'endroit où vous vérifiez ModelState.isValid et survolent le ModelState. Maintenant vous pouvez facilement parcourir toutes les valeurs à l'intérieur et voir quelle erreur provoque le retour IsValid false.

modelstate

216
répondu bastijn 2013-10-28 07:38:26
bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

ou itérer avec

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
    {

    }
20
répondu Michael G 2009-11-24 19:20:27

parfois, un classeur lance une exception sans message d'erreur. Vous pouvez récupérer l'exception avec l'extrait suivant pour découvrir ce qui ne va pas:

(souvent si le liant essaie de convertir des chaînes en types complexes, etc)

 if (!ModelState.IsValid)
            {
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

// Breakpoint, Log or examine the list with Exceptions.

  }
12
répondu Jonas Stensved 2011-07-06 08:44:37

collez le code ci-dessous dans le résultat de L'action de votre controller et placez le débogueur à ce point.

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();
9
répondu Krishna 2017-03-15 05:21:57

la propriété ModelState sur le controller est en fait un objet ModelStateDictionary. Vous pouvez itérer les touches du dictionnaire et utiliser la méthode IsValidField pour vérifier si ce champ est valide.

3
répondu tvanfosson 2009-11-24 17:27:31

comme cela vient de m'arriver - cela peut aussi arriver quand vous ajoutez une propriété requise à votre modèle sans mettre à jour votre formulaire. Dans ce cas, le ValidationSummary n'affichera pas le message d'erreur.

2
répondu AndyP9 2017-01-10 09:30:47

si vous retirez le contrôle pour le ModelsState.IsValid et laisser l'erreur, si vous copiez cette ligne ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors et la coller dans la section watch dans Visual Studio, il vous donnera exactement ce que l'erreur est. Économise beaucoup de temps en vérifiant où est l'erreur.

2
répondu Tom McDonough 2018-07-17 11:53:12