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.
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.
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.
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))
{
}
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.
}
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();
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.
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.
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.