154 votes

À quoi sert ModelState.IsValid dans ASP.NET MVC dans NerdDinner?

Sur le NerdDinner exemple de Professionnel ASP.NET MVC 1.0, il y a une méthode pour créer un nouveau dîner comme copiée dans le soufflet (page 89 de la libre NerdDinner version).

Il vérifie ModelState.IsValid pour de vrai. Il semble à vérifier si le modèle est valide pour la base de données (qui est, il attrape les conversions de types de données, comme les dates avec format non valide, mais pas de règles de gestion). Est-ce vrai?

Lorsque vous soumettez le formulaire, si vous avez une erreur dans la date, ModelState.IsValid sera faux et vous en obtiendrez une erreur, mais seulement pour la date car AddRuleViolations n'a jamais été exécutée. Si vous décochez la case pour ModelState.IsValid complètement, alors vous aurez toutes les erreurs (en raison de l'exception), y compris le marquage de la date à laquelle il est invalide. Alors, pourquoi le vérifier ModelState.IsValid il à tous? Ai-je raté 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); 
}

155voto

Brad Wilson Points 22910

ModelState.IsValid vous indique si des erreurs de modèle ont été ajoutées à ModelState.

Le classeur de modèle par défaut ajoutera des erreurs pour les problèmes de conversion de type de base (par exemple, passer un non-numéro pour quelque chose qui est un "int"). Vous pouvez remplir ModelState plus complètement en fonction du système de validation que vous utilisez.

L'exemple de classeur de modèle DataAnnotations remplit l'état du modèle avec des erreurs de validation extraites des attributs DataAnnotations de votre modèle.

26voto

Kelly Orr Points 426

De 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X