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.
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. –
Alle erforderlichen Attribute sind eingetragen, aber mein Modellzustand ist immer noch nicht gültig! – kokomoi
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. –