2009-08-07 9 views
1

J'essaie de configurer xVal avec un projet ASP.NET MVC 2 Preview 1. Je suis fondamentalement en suivant l'exemple à http://blog.codeville.net/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/ à la lettre (côté serveur seulement, jusqu'à présent).Messages d'erreur xVal apparaissant deux fois

J'annotée une entité BlogPost, et voici l'action post:

[HttpPost] 
public ActionResult Index(BlogPost b) 
{ 
    try 
    { 
     _blogService.Insert(b); 
    } 
    catch (RulesException ex) 
    { 
     ex.AddModelStateErrors(ModelState, ""); 
    } 

    return (View(b)); 
} 

Et voici la méthode de service:

public void Insert(BlogPost post) 
{ 
    var errors = DataAnnotationsValidationRunner.GetErrors(post); 
    if(errors.Any()) 
    { 
     throw new RulesException(errors); 
    } 

    _blogRepo.Insert(post); 
} 

(Notez que le DataAnnotationsValidationRunner est mot pour mot de l'exemple de blog). Lorsque je soumets un formulaire BlogPost totalement invalide, j'obtiens cette liste d'erreurs de validation:

  • Une valeur est requise.
  • S'il vous plaît donner un titre
  • S'il vous plaît entrer une date affichée
  • S'il vous plaît entrer un contenu
  • S'il vous plaît donner un titre
  • S'il vous plaît entrer une date affichée
  • S'il vous plaît entrer un contenu

Je ne sais même pas à quoi sert le premier message, mais comme vous pouvez le voir, les autres erreurs apparaissent deux fois. Qu'est-ce que je fais mal? Ou est-ce un problème avec MVC V2?

Répondre

1

À partir de ASP.Net MVC 2 Aperçu 1 nous obtenons maintenant un support de validation DataAnnotation de la boîte, donc je suppose que votre problème est que lorsque la logique ModelBinder exécute applique les règles de DataAnnotation:

public ActionResult Index(BlogPost b) //Create BlogPost object and apply rules 

puis avec votre logique ValX vous demandez le chèque de nouveau:

var errors = DataAnnotationsValidationRunner.GetErrors(post); 

Ceci est soutenu par le fait qu'ils sont répétées dans le même ordre.

Votre code aurait bien fonctionné dans la version 1 de MVC comme ActionResult publics Index (BlogPost b) aurait pas exécuter les règles de DataAnnotation. Je n'ai lu nulle part s'il est possible de désactiver la nouvelle logique DataAnnotation et d'utiliser simplement XVal.

Il n'y a plus d'informations à ce sujet sur Scott's post able preview 1

Pour savoir ce que le premier élément est exécuté débogage et vérifier quelles erreurs sont sur le ModelState, car cela vous dira ce que la propriété sur l'objet les erreurs sont liées à .

[HttpPost] 
public ActionResult Index(BlogPost b) 
{ 
    try 
    { 
     _blogService.Insert(b); //Add breakpoint here and check ModelState 
    } 
    catch (RulesException ex) 
    { 
     ex.AddModelStateErrors(ModelState, ""); 
    } 

    return (View(b)); 
} 
+0

Oui, c'est ça. En fait, je ne pensais pas que les trucs Annotation fonctionneraient aussi facilement, wow. Quoi qu'il en soit, l'autre erreur était parce que je n'ai pas défini la valeur Id pour utiliser un ensemble privé (NHibernate POCO). Merci beaucoup! –