web-dev-qa-db-fra.com

ModelState.IsValid == false, pourquoi?

Où puis-je trouver la liste des erreurs rendant le ModelState invalide? Je n'ai vu aucune propriété error sur l'objet ModelState.

106
Omu

A propos de "peut-il être que 0 erreurs et 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 ça ne peut pas être. Eh bien, c'est pour ASP.NET MVC v1.

42
queen3

Comme vous programmez probablement dans Visual studio, vous feriez mieux de tirer parti de la possibilité d'utiliser des points d'arrêt pour des étapes de débogage aussi simples (pour avoir une idée du problème, comme dans votre cas). Il suffit de les placer juste devant/à l’endroit où vous consultez ModelState.isValid et de survoler le ModelState. Maintenant, vous pouvez facilement parcourir toutes les valeurs et voir quelle erreur provoque le retour faux.

modelstate

241
bastijn
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))
    {

    }
22
Michael G

Collez le code ci-dessous dans le ActionResult de votre contrôleur et placez le débogueur à ce stade.

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();
19
Krishna

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

(Souvent si le classeur tente 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
Jonas Stensved

Si vous supprimez la vérification de ModelsState.IsValid et laissez-la erreur, si vous copiez cette ligne ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors et collez-le dans la section de surveillance de Visual Studio, il vous indiquera exactement quelle est l'erreur. Enregistre beaucoup de temps en vérifiant où est l'erreur.

4
Tom McDonough

La propriété ModelState sur le contrôleur est en réalité un objet ModelStateDictionary. Vous pouvez parcourir les clés du dictionnaire et utiliser la méthode IsValidField pour vérifier si ce champ particulier est valide.

3
tvanfosson

Comme cela m’est arrivé, cela peut également se produire lorsque vous ajoutez une propriété requise à votre modèle sans mettre à jour votre formulaire. Dans ce cas, le ValidationSummary ne répertoriera pas le message d'erreur.

2
AndyP9