Antworten:
Über "Kann es sein, dass 0 Fehler und IsValid == false": Hier ist der MVC-Quellcode von 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);
}
}
Nun sieht es so aus, als ob es nicht sein kann. Nun, das ist für ASP.NET MVC v1.
Da Sie wahrscheinlich in Visual Studio programmieren, sollten Sie die Möglichkeit nutzen, Haltepunkte für so einfache Debugging-Schritte zu verwenden (um eine Vorstellung davon zu bekommen, wie das Problem in Ihrem Fall ist). Platzieren Sie sie einfach vor / an der Stelle, an der Sie ModelState.isValid überprüfen, und bewegen Sie den Mauszeiger über den ModelState. Jetzt können Sie einfach alle darin enthaltenen Werte durchsuchen und feststellen, welcher Fehler die isvalid-Rückgabe false verursacht.
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
kann Ihnen helfen
Fügen Sie den folgenden Code in das ActionResult Ihres Controllers ein und platzieren Sie den Debugger an dieser Stelle.
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);
oder iterieren mit
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
Manchmal löst ein Ordner eine Ausnahme ohne Fehlermeldung aus. Sie können die Ausnahme mit dem folgenden Snippet abrufen, um herauszufinden, was falsch ist:
(Oft, wenn der Ordner versucht, Zeichenfolgen in komplexe Typen usw. zu konvertieren.)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
Wenn Sie die Prüfung für ModelsState.IsValid entfernen und einen Fehler zulassen, erhalten Sie beim Kopieren dieser Zeile ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
und Einfügen in den Überwachungsabschnitt in Visual Studio genau den Fehler. Spart viel Zeit bei der Überprüfung, wo der Fehler liegt.
Die ModelState-Eigenschaft auf dem Controller ist tatsächlich ein ModelStateDictionary-Objekt. Sie können die Schlüssel im Wörterbuch durchlaufen und mithilfe der IsValidField-Methode überprüfen, ob dieses bestimmte Feld gültig ist.