2009-05-19 10 views
126

Auf dem NerdDinner Beispiel von Professional ASP.NET MVC 1.0 gibt es eine Methode, um ein neues Abendessen als unten kopiert zu erstellen (Seite 89 der freien NerdDinner-Version).Was ist ModelState.IsValid für in ASP.NET MVC in NerdDinner gültig?

Dort überprüft es ModelState.IsValid für True. Es scheint zu überprüfen, ob das Modell für die Datenbank gültig ist (dh es fängt Datentypkonvertierungen ein, wie Datumsangaben mit ungültigem Format, aber keine Geschäftsregeln). Ist das wahr?

Wenn Sie das Formular senden, wenn ModelDate.IsValid einen Fehler in dem Datum hat, wird ModelState.IsValid falsch sein und Sie werden einen Fehler zurückgeben, aber 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 in dem Datum, wenn es ungültig ist. Warum ist da überhaupt der Check für ModelState.IsValid? Fehle 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); 
} 

Antwort

124

ModelState.IsValid sagt Ihnen, ob ein Modellfehler haben ModelState hinzugefügt.

Der Standardmodellbinder fügt einige Fehler bei grundlegenden Konvertierungsproblemen hinzu (z. B. die Übergabe einer Nicht-Nummer für etwas, das ein "int" ist). Sie können ModelState basierend auf dem von Ihnen verwendeten Validierungssystem vollständiger auffüllen.

Der Modellbinder DataAnnotations füllt den Modellstatus mit Validierungsfehlern aus den DataAnnotations Attributen in Ihrem Modell.

+0

Brad ist es eine Möglichkeit, wenn ein Modell, um herauszufinden, die mit DataAnnotations „verziert IsValid "ohne ModelState. (Sagen wir zum Beispiel, das Objekt wird aus einer Datei geladen oder in einer Konsolen-App usw. verwendet) –

+1

Nein, ModelState.IsValid ist der einzige Weg zu wissen, ob während der Modellbindung Validierungs- (oder Datenumwandlungs-) Fehler aufgetreten sind. –

+0

@Brad, wenn Sie sagen "Sie können ModelState vollständiger basierend auf dem von Ihnen verwendeten Validierungssystem auffüllen", wie wird das erreicht? Gibt es eine Möglichkeit, meinen ModelState-Validierungscode für mein ViewModel zu öffnen? Ich verwende EF4, daher ist der Großteil meiner Validierung automatisch out-of-the-box. – WEFX

24

Vom 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

+4

Ab 2015 existiert die 'AddModelErrors' Methode nicht mehr. –

+4

Ab 2016 existiert die 'ModelState.AddModelErrors()' Methode – John

+4

Ab 2017 existiert die nicht-plurale 'ModelState.AddModelError' Methode. – Zachafer

Verwandte Themen