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.
la validation que vous avez mentionnée, est-ce pour l'objet Grant? – pjobs
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