Réponses:
À 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, il semble que ce ne soit pas possible. 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 simples (avoir une idée du problème dans votre cas). Placez-les simplement devant / à l'endroit où vous vérifiez ModelState.isValid et survolez ModelState. Vous pouvez maintenant parcourir facilement toutes les valeurs à l'intérieur et voir quelle erreur provoque le retour isvalid false.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
peut vous aider
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();
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 lève une exception sans message d'erreur. Vous pouvez récupérer l'exception avec l'extrait de code suivant pour découvrir ce qui ne va pas:
(Souvent, si le classeur 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.
}
Si vous supprimez la vérification de ModelsState.IsValid et laissez l'erreur, si vous copiez cette ligne ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
et la collez dans la section de surveillance de Visual Studio, cela vous donnera exactement l'erreur. Gain de temps à vérifier où se trouve l'erreur.
La propriété ModelState sur le contrôleur est en fait 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.