2016-04-27 11 views
7

Wenn ich eine Methode erstellen i mein Objekt in dem Parameter binden und ich prüfe dann, ob ModelState gültig ist, so füge ich an die Datenbank:Was macht ModelState.IsValid?

Aber wenn ich brauche etwas zu ändern, bevor ich in die Datenbank (bevor ich ändere es die ModelState könnte nicht gültig sein, also muss ich es tun) warum der Modellzustand immer noch nicht gültig.

Was überprüft diese Funktion genau?

Dies ist mein Beispiel:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) { 
    encaissement.Montant = Convert.ToDecimal(encaissement.Montant); 
    ViewBag.montant = encaissement.Montant; 
    if (ModelState.IsValid) { 
    db.Encaissements.Add(encaissement); 
    db.SaveChanges(); 
    return RedirectToAction("Index", "Encaissement"); 
    }; 
    ViewBag.ProjetID = new SelectList(db.Projets, "ProjetId", "nomP"); 
    return View(encaissement); 
} 
+0

Haben Sie für Ihr Modell die erforderlichen Attribute? Wenn eines dieser erforderlichen Felder nicht eingegeben wird, ist der Status des Modells nicht gültig. –

+0

Alle erforderlichen Attribute sind eingetragen, aber mein Modellzustand ist immer noch nicht gültig! – kokomoi

+0

Sehen Sie sich meine Antwort an. Möglicherweise ist Ihre Ansicht an int oder datetime gebunden, die keine Nullwerte enthalten kann. Dies kann auch dazu führen, dass ModelState ungültig wird. –

Antwort

11

ModelState.IsValid gibt an, ob die eingehenden Werte von der Anforderung korrekt an das Modell gebunden werden konnten und ob explizit angegebene Validierungsregeln während des Modellbindungsprozesses unterbrochen wurden.

In Ihrem Beispiel ist das Modell, das gebunden wird, vom Klassentyp . Validierungsregeln sind diejenigen, die im Modell durch Verwendung von Attributen, Logik und Fehlern spezifiziert werden, die innerhalb der IValidatableObject Methode Validate() hinzugefügt werden - oder einfach innerhalb des Codes der Aktionsmethode.

Wenn die Eigenschaft IsValid wahr ist, wenn die Werte korrekt an das Modell binden konnten UND dabei keine Validierungsregeln verletzt wurden.

Hier ist ein Beispiel dafür, wie ein Validierungsattribut und IValidatableObject könnten auf Ihrer Modellklasse implementiert werden:

public class Encaissement : IValidatableObject 
{ 
    // A required attribute, validates that this value was submitted  
    [Required(ErrorMessage = "The Encaissment ID must be submitted")] 
    public int EncaissementID { get; set; } 

    public DateTime? DateEncaissement { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var results = new List<ValidationResult>(); 

     // Validate the DateEncaissment 
     if (!this.DateEncaissement.HasValue) 
     { 
      results.Add(new ValidationResult("The DateEncaissement must be set", new string[] { "DateEncaissement" }); 
     } 

     return results; 
    } 
} 

Hier ist ein Beispiel dafür, wie die gleiche Gültigkeitsregel innerhalb der Aktionsmethode Ihres Beispiels angewandt werden kann:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) { 

    // Perform validation 
    if (!encaissement.DateEncaissement.HasValue) 
    { 
     this.ModelState.AddModelError("DateEncaissement", "The DateEncaissement must be set"); 
    } 

    encaissement.Montant = Convert.ToDecimal(encaissement.Montant); 

    ViewBag.montant = encaissement.Montant; 

    if (ModelState.IsValid) { 

    db.Encaissements.Add(encaissement); 
    db.SaveChanges(); 
    return RedirectToAction("Index", "Encaissement"); 

    }; 

    ViewBag.ProjetID = new SelectList(db.Projets, "ProjetId", "nomP"); 

    return View(encaissement); 
} 

Es ist zu beachten, dass die Werttypen der Eigenschaften Ihres Modells ebenfalls validiert werden. Beispielsweise können Sie einer int-Eigenschaft keinen Zeichenfolgenwert zuweisen. Wenn Sie dies tun, wird es nicht gebunden und der Fehler wird zu Ihrem ModelState auch hinzugefügt.

In Ihrem Beispiel konnte der EncaissementID Wert keinen Wert von "Hello" gepostet haben, dies würde dazu führen, dass ein Modellüberprüfungsfehler hinzugefügt wird, und IsValid wird falsch sein.

Es ist aus einem der oben genannten Gründe (und möglicherweise mehr), dass der IsValid Bool-Wert des Modellzustands false ist.

+0

danke, aber es ist immer noch fuggy! Wenn ich zum Beispiel etwas in meinem Modell ändere, muss ich eine Zeichenkette in eine Dezimalzahl umwandeln, dann füge ich zur Datenbank hinzu. Die modelstate.isvalid prüft das Modell, das im Parameter übergeben wurde, nicht den Zustand nach meinen Aktualisierungen. – kokomoi

7

ModelState.IsValid werden Ihnen grundsätzlich sagen, ob es auf den Server alle Probleme mit Ihren Daten geschrieben ist, basierend auf den Daten Anmerkungen zu den Eigenschaften des Modells hinzugefügt.

Wenn Sie beispielsweise eine [Required(ErrorMessage = "Please fill")] haben und diese Eigenschaft leer ist, wenn Sie Ihr Formular an den Server senden, ist ModelState ungültig.

Der ModelBinder überprüft auch einige grundlegende Dinge für Sie. Wenn Sie beispielsweise einen BirthDate-Datepicker haben und die Eigenschaft, an die der Picker gebunden ist, keinen nullbaren Typ DateTime hat, ist Ihr ModelState auch ungültig, wenn Sie das Datum leer gelassen haben.

Here und here sind einige nützliche Beiträge zu lesen.

2

Sie können eine große Beschreibung über ModelState und seine Verwendung here finden.

Speziell die IsValid Eigenschaft ist eine schnelle Möglichkeit, um zu überprüfen, ob es Feldfehler in ModelState.Errors gibt. Wenn Sie nicht sicher sind, was Ihr Modell zu dem Zeitpunkt, an dem es auf Ihre Controller-Methode verweist, ungültig ist, können Sie die ModelState.Errors-Eigenschaft überprüfen, die mindestens einen Formularüberprüfungsfehler ergeben sollte.

+0

ModelState.Errors existiert nicht! Es gibt: SerializeErrors und AddModelError das ist alles – kokomoi

+2

Es ist 'ModelState [" Property "]. Errors'. Mit anderen Worten, 'ModelState' ist eine Art Wörterbuch. Jede Eigenschaft in Ihrem Modell, die gepostet wird, erhält einen Schlüssel. Sie müssen das Wörterbuch für die entsprechende Eigenschaft indizieren, um die Fehler für diese Eigenschaft anzuzeigen. Wenn Sie nur herausfinden wollen, was ausgeht, debuggen Sie und setzen Sie irgendwo in Ihrer Post-Aktion einen Haltepunkt. Dann inspizieren Sie "ModelState", Schlüssel für Schlüssel, und betrachten die "Errors" -Sammlung jedes einzelnen. –