Sur le NerdDinner exemple de Professional ASP.NET MVC 1.0 , il existe une méthode pour créer un nouveau dîner copié ci-dessous (page 89 de la version gratuite de NerdDinner).
Là, il vérifie que ModelState.IsValid est vrai. Il semble vérifier si le modèle est valide pour la base de données (c'est-à-dire qu'il capture les conversions de types de données, telles que les dates avec un format non valide, mais pas les règles commerciales). Est-ce vrai?
Lors de la soumission du formulaire, si vous avez une erreur dans la date, ModelState.IsValid sera false et vous obtiendrez une erreur, mais uniquement pour la date, car AddRuleViolations n'a jamais été exécuté. Si vous supprimez complètement la vérification de ModelState.IsValid, vous obtiendrez toutes les erreurs (en raison de l'exception), y compris un marquage de la date d'invalidité. Alors, pourquoi la vérification de ModelState.IsValid est-elle là? Est-ce que je manque quelque chose?
//
// 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);
}
ModelState.IsValid
vous indique si des erreurs de modèle ont été ajoutées à ModelState
.
Le classeur de modèles par défaut ajoutera des erreurs pour les problèmes de conversion de type de base (par exemple, passer un non-numéro pour un élément qui est un "int"). Vous pouvez renseigner ModelState plus complètement en fonction du système de validation que vous utilisez.
L'exemple de classeur DataAnnotations
remplit l'état du modèle avec des erreurs de validation provenant des attributs DataAnnotations
de votre modèle.
Depuis l'errata: ModelState.AddRuleViolations(dinner.GetRuleViolations());
Devrait être:
ModelState.AddModelErrors(dinner.GetRuleViolations());
Oui, Jared et Kelly Orr ont raison . J'utilise le code suivant comme dans edit exception.
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
au lieu de
ModelState.AddRuleViolations(dinner.GetRuleViolations());