Ответ 1
ModelState.IsValid указывает, можно ли было правильно связать входящие значения из запроса с моделью и были ли какие-либо явно заданные правила проверки нарушены во время процесса связывания модели.
В вашем примере связанная модель относится к типу класса Encaissement
. Правила проверки - это правила, указанные в модели с использованием атрибутов, логики и ошибок, добавленных в методе IValidatableObject
Validate()
или просто в коде метода действия.
Свойство IsValid
будет иметь значение true, если значения были в состоянии правильно привязаться к модели И никакие правила проверки не были нарушены в процессе.
Вот пример того, как атрибут проверки и IValidatableObject
могут быть реализованы в вашем классе модели:
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;
}
}
Вот пример того, как одно и то же правило проверки может быть применено в методе действия вашего примера:
[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);
}
Следует иметь в виду, что типы значений свойств вашей модели также будут проверены. Например, вы не можете присвоить строковое значение свойству int
. Если вы это сделаете, он не будет связан, и ошибка будет добавлена и в ваш ModelState
.
В вашем примере значение EncaissementID
не может иметь значение "Hello"
, отправленное в него, это приведет к добавлению ошибки проверки модели, и IsValid
будет ложным.
По любой из вышеперечисленных причин (и, возможно, больше) значение bool IsValid
модельного состояния будет false
.