154 Stimmen

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

Auf der NerdDinner Beispiel für Professionelles ASP.NET MVC 1.0 es gibt eine Methode, um ein neues Abendessen zu erstellen, wie unten kopiert (Seite 89 der kostenlosen NerdDinner-Version).

Dort wird ModelState.IsValid auf true geprüft. Es scheint zu prüfen, ob das Modell für die Datenbank gültig ist (d.h. es erkennt Datentypkonvertierungen, wie z.B. Datumsangaben mit ungültigem Format, aber keine Geschäftsregeln). Ist das wahr?

Wenn beim Absenden des Formulars ein Fehler im Datum auftritt, wird ModelState.IsValid auf false gesetzt, und Sie erhalten einen Fehler zurück, allerdings nur für das Datum, da AddRuleViolations nie ausgeführt wurde. Wenn Sie die Prüfung für ModelState.IsValid vollständig entfernen, erhalten Sie alle Fehler (aufgrund der Ausnahme), einschließlich einer Markierung im Datum, wenn es ungültig ist. Warum ist dann die Prüfung auf ModelState.IsValid überhaupt vorhanden? Übersehe 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); 
}

154voto

Brad Wilson Punkte 64944

ModelState.IsValid sagt Ihnen, ob Modellfehler zu ModelState .

Der Standardmodellbinder fügt einige Fehler für grundlegende Typkonvertierungsprobleme hinzu (z. B. Übergabe einer Nicht-Zahl für etwas, das ein "int" ist). Sie können ModelState vollständiger ausfüllen, je nachdem, welches Validierungssystem Sie verwenden.

Die Probe DataAnnotations Modellbinder füllt den Modellstatus mit Validierungsfehlern aus der DataAnnotations Attribute für Ihr Modell.

0 Stimmen

Brad, gibt es eine Möglichkeit, herauszufinden, ob ein Modell, das mit DataAnnotations "IsValid" ohne ModelState dekoriert ist. (Sagen Sie zum Beispiel, dass das Objekt aus einer Datei geladen oder in einer Konsolenanwendung verwendet wird usw.)

1 Stimmen

Nein, ModelState.IsValid ist die einzige Möglichkeit zu erfahren, ob während der Modellbindung Fehler bei der Validierung (oder Datenkonvertierung) aufgetreten sind.

0 Stimmen

@Brad, wenn Sie sagen: "Sie können ModelState vollständiger ausfüllen, basierend auf dem Validierungssystem, das Sie verwenden", wie wird das bewerkstelligt? Gibt es eine Möglichkeit, meinen ModelState-Validierungscode für mein ViewModel zu öffnen? Ich verwende EF4, so dass die meisten meiner Validierung ist automatisch out-of-the-Box.

26voto

Kelly Orr Punkte 751

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 Stimmen

Ab 2015 wird die AddModelErrors Methode gibt es nicht.

6 Stimmen

Ab 2016 wird die ModelState.AddModelErrors() Methode existiert

8 Stimmen

Ab 2017 wird der Nicht-Plural ModelState.AddModelError Methode existiert.

1voto

B.Khan Punkte 11

Alle Modellfelder, die bestimmte Typen haben, sollten validiert werden, wenn sie an den Controller zurückgegeben werden. Wenn eines der Modellfelder nicht mit seinem definierten Typ übereinstimmt, gibt ModelState.IsValid false zurück. Denn diese Fehler werden in ModelState.

0voto

Phoe Htoo Punkte 1

Ja, Jared und Kelly Orr haben Recht. Ich verwende den folgenden Code wie in Ausnahme bearbeiten.

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

anstelle von

ModelState.AddRuleViolations(dinner.GetRuleViolations());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X