2016-10-19 1 views
0

J'ai installé FluentValidation sur mon site Web MVC. L'un de mes objets a un contrôle de validation qui utilise la commande doit à appeler une fonction:FluentValidation effectuant la validation au mauvais moment

RuleFor(m => m).Must(m => reimbursementMonthsRequired(m)).WithMessage("Wrong!").WithName("ReimbursementStartMonth"); 

La fonction reimbursementMonthsRequired vérifie une valeur sur l'objet et une collection sous l'objet pour déterminer la validité.

J'ai une méthode Post qui accepte une liste de valeurs qui est utilisée pour mettre à jour cette collection:

[HttpPost] 
public ActionResult AddGrant(Grant item, List<byte> reimbursementMonths) 
{ 
    item.UpdateReimbusementMonths(Database, reimbursementMonths); 
    if (ModelState.IsValid) 
    {  
    Database.Grants.Add(item); 
    Database.SaveChanges(); 
    ... 

Le problème que je vais avoir est que, dans cette fonction, le contrôle de validation est appelée avant UpdateReimbusementMonths est appelé. Les données dont j'ai besoin pour que la vérification de validation fonctionne correctement ne sont pas encore là. La chose étrange est, est que dans ma fonction d'édition, la validation se produit après que j'appelle UpdateReimbursementMonths, donc cela fonctionne correctement. C'est ce qui fait:

[HttpPost] 
public ActionResult EditGrant(int id, List<byte> reimbursementMonths) 
{ 
    var item = Database.Grants.Find(id); 
    item.UpdateReimbusementMonths(Database, reimbursementMonths); 
    TryUpdateModel(item); 
    if (ModelState.IsValid) 
    ... 

Alors, comment puis-je obtenir ma fonction Ajouter à faire la validation au bon moment - être après l'appel de fonction pour mettre à jour la collection? Il semble que si je pouvais réexécuter les contrôles de validation après cet appel de fonction, cela fonctionnerait.

+0

la validation que vous avez mentionnée, est-ce pour l'objet Grant? – pjobs

+0

Pas la meilleure solution ... mais qu'en est-il de vous Supprimer la clé de ModelState (en utilisant ModelState.Remove) avant le ModelState.IsValid? Ensuite, vous pouvez ajouter vos subventions et ajouter la clé à ModelState et la valider à nouveau. – Sparrow

Répondre

0

J'ai trouvé que cela fonctionne pour que la méthode AddGrant fasse quelque chose de similaire à EditGrant. Au lieu de prendre un objet Grant en tant que paramètre de méthode que je l'ai fait:

public ActionResult AddGrant(List<byte> reimbursementMonths) 
{  
    var item = new Grant(); 
    item.UpdateReimbusementMonths(Database, reimbursementMonths); 
    TryUpdateModel(item); 

    if (ModelState.IsValid) 
    {  
    ... 

Heureusement, je ne pas utiliser toutes les valeurs de l'objet Grant dans la méthode UpdateReimbusementMonths. Si je le faisais, je devrais trouver quelque chose d'autre parce que, apparemment, TryUpdateModel déclenche le processus de validation.

0

Il travaille selon documentation

Dans la méthode AddGrant vous envoyez des messages objet de subvention il ne fait validation après la liaison automatique avant d'exécuter un code dans votre méthode d'action.

-> Vous devez soit mettre à jour Grant avec des remboursements avant de poster ou supprimer la validation courante et effectuer cette validation manuellement dans la méthode d'action.

-> Une autre option consiste à écrire un Validator Interceptors personnalisé et de mettre à jour l'élément Grant avec la méthode Remboursements dans BeforeMvcValidation. (Cela peut être un hack et ne pas être idéal à faire)