web-dev-qa-db-fra.com

Qu'est-ce que ModelState.IsValid est valide dans ASP.NET MVC dans NerdDinner?

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); 
} 
132
pupeno

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.

132
Brad Wilson

Depuis l'errata: ModelState.AddRuleViolations(dinner.GetRuleViolations());

Devrait être:

ModelState.AddModelErrors(dinner.GetRuleViolations());

Référence: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html

25
Kelly Orr

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());
0
Phoe Htoo