ModelState.IsValid indica se è stato possibile associare correttamente i valori in arrivo dalla richiesta al modello e se durante il processo di associazione modello sono state violate regole di convalida esplicitamente specificate.
Nell'esempio, il modello che viene associato è di tipo classe Encaissement
. Le regole di convalida sono quelle specificate nel modello mediante l'uso di attributi, la logica e gli errori aggiunti nel metodo Validate()
o semplicemente all'interno del codice del metodo di azione.
Se la proprietà IsValid
è vera se i valori erano in grado di eseguire il bind correttamente nel modello E nessuna regola di convalida è stata interrotta nel processo.
Ecco un esempio di come un attributo di convalida e IValidatableObject
potrebbero essere attuate sul tuo classe del modello:
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;
}
}
Ecco un esempio di come la stessa regola di convalida può essere applicata all'interno del metodo di azione del vostro esempio:
[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);
}
Vale la pena tenere presente che verranno convalidati anche i tipi di valore delle proprietà del modello. Ad esempio, non è possibile assegnare un valore di stringa a una proprietà int
. Se lo fai, non sarà vincolato e l'errore verrà aggiunto anche al tuo ModelState
.
Nell'esempio, il valore EncaissementID
non può avere un valore di "Hello"
registrato, ciò causerebbe l'aggiunta di un errore di convalida del modello e IsValid
sarà falso.
È per uno dei motivi di cui sopra (e possibilmente di più) che il valore bool IsValid
dello stato del modello sarà false
.
Avete degli attributi richiesti sul modello? Se uno di questi campi obbligatori non è inserito, lo stato dei modelli non sarà valido. –
tutti gli attributi richiesti sono stati inseriti ma lo stato del mio modello non è ancora valido! – kokomoi
Guardate la mia risposta, forse la vostra vista è vincolante per int o datetime che non è annullabile, e questo può anche far sì che ModelState non sia valido. –