Wofür ist ModelState.IsValid in ASP.NET MVC in NerdDinner gültig?


148

Im NerdDinner- Beispiel von Professional ASP.NET MVC 1.0 gibt es eine Methode zum Erstellen eines neuen Abendessens als unten kopiert (Seite 89 der kostenlosen NerdDinner-Version).

Dort prüft es ModelState.IsValid auf true. Es scheint zu prüfen, ob das Modell für die Datenbank gültig ist (dh es erfasst Datentypkonvertierungen, z. B. Daten mit ungültigem Format, jedoch keine Geschäftsregeln). Ist das wahr?

Wenn Sie beim Senden des Formulars einen Fehler im Datum haben, ist ModelState.IsValid falsch und Sie erhalten einen Fehler zurück, jedoch nur für das Datum, da AddRuleViolations nie ausgeführt wurde. Wenn Sie die Prüfung für ModelState.IsValid vollständig entfernen, werden alle Fehler (aufgrund der Ausnahme) angezeigt, einschließlich einer Markierung im Datum, an dem sie ungültig ist. Warum wird dann überhaupt nach ModelState.IsValid gesucht? Vermisse ich etwas

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

Antworten:


143

ModelState.IsValidteilt Ihnen mit, ob Modellfehler hinzugefügt wurden ModelState.

Der Standardmodellordner fügt einige Fehler für grundlegende Probleme bei der Typkonvertierung hinzu (z. B. Übergeben einer Nicht-Nummer für etwas, das ein "int" ist). Sie können ModelState basierend auf dem von Ihnen verwendeten Validierungssystem vollständiger füllen.

Der Beispielmodellordner DataAnnotationsfüllt den Modellstatus mit Validierungsfehlern, die aus den DataAnnotationsAttributen Ihres Modells stammen.


Brad gibt es eine Möglichkeit herauszufinden, ob ein Modell, das mit DataAnnotations "IsValid" ohne ModelState dekoriert ist. (
Angenommen,

1
Nein, ModelState.IsValid ist die einzige Möglichkeit, um festzustellen, ob während der Modellbindung Validierungs- (oder Datenkonvertierungs-) Fehler aufgetreten sind.
Brad Wilson

@Brad, wenn Sie sagen "Sie können ModelState basierend auf dem von Ihnen verwendeten Validierungssystem vollständiger füllen", wie wird dies erreicht? Gibt es eine Möglichkeit, meinen ModelState-Validierungscode für mein ViewModel zu öffnen? Ich verwende EF4, daher erfolgt der größte Teil meiner Validierung automatisch sofort.
WEFX

13
Verwenden Sie: var errors = ModelState.Values.SelectMany(v => v.Errors);mit einem Haltepunkt, um Validierungsprobleme anzuzeigen.
full_prog_full

Manchmal ist es ein Fehler in der zugehörigen Tabelle, wenn Eigenschaftsnamen geändert wurden, keine Migrationen durchgeführt wurden und daher SaveChanges (); schlägt fehl und kann aufgrund der Änderung nicht auftreten.
Oracular Man

25

Aus den Errata: ModelState.AddRuleViolations(dinner.GetRuleViolations());

Sollte sein:

ModelState.AddModelErrors(dinner.GetRuleViolations());

Referenz: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html


5
Ab 2015 existiert die AddModelErrorsMethode nicht mehr.
Felipe Correa

6
Ab 2016 existiert die ModelState.AddModelErrors()Methode
John

7
Ab 2017 besteht die Nicht-Plural- ModelState.AddModelErrorMethode.
Zachafer

0

Ja, Jared und Kelly Orr haben recht. Ich benutze den folgenden Code wie in Bearbeitungsausnahme.

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

anstatt

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

Alle Modellfelder mit bestimmten Typen sollten überprüft werden, wenn sie an Controller zurückgegeben werden. Wenn eines der Modellfelder nicht mit dem definierten Typ übereinstimmt, gibt ModelState.IsValid false zurück. Diese Fehler werden in ModelState hinzugefügt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.