2016-10-19 8 views
0

Ich habe FluentValidation Setup auf meiner MVC-Website. Eine meiner Aufgaben hat eine Plausibilitätsprüfung, die die Must-Befehl verwendet eine Funktion aufzurufen:FluentValidation Validierung zur falschen Zeit

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

Die reimbursementMonthsRequired Funktion prüft einen Wert auf dem Objekt und eine Sammlung unter dem Objekt Gültigkeit zu bestimmen.

Ich habe eine Post-Methode, das eine Liste von Werten annimmt, die diese Sammlung zu aktualisieren, verwendet wird:

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

Das Problem, das ich habe, ist, dass in dieser Funktion wird die Validierungsprüfung vor UpdateReimbusementMonths genannt ist namens. Die Daten, die ich für die Validierungsprüfung zur Verfügung haben muss, sind also noch nicht vorhanden. Die seltsame Sache ist, ist, dass in meiner Edit-Funktion die Validierung passiert, nachdem ich UpdateReismurementMonths aufgerufen habe, so dass es richtig funktioniert. Dies ist, was das tut:

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

Wie kann ich meine Funktion Hinzufügen zur richtigen Zeit zu tun Validierung erhalten - nach dem Funktionsaufruf wird die Sammlung zu aktualisieren? Es scheint, dass, wenn ich die Validierungsprüfungen nach diesem Funktionsaufruf erneut ausführen könnte, das funktionieren würde.

+0

Validierung Sie erwähnt, ist das für Grant-Objekt? – pjobs

+0

Nicht die beste Lösung ... aber wie steht es mit Ihnen Entfernen Sie den Schlüssel aus ModelState (mit ModelState.Remove) vor dem ModelState.IsValid? Dann können Sie Ihre Berechtigungen hinzufügen und den Schlüssel zum ModelState hinzufügen und erneut validieren. – Sparrow

Antwort

0

Ich fand, dass es funktioniert, die AddGrant-Methode etwas Ähnliches wie EditGrant zu haben. Statt ein Grant-Objekts als Methodenparameter der Einnahme habe ich dies:

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

    if (ModelState.IsValid) 
    {  
    ... 

Glücklicherweise verwende ich keine Werte aus dem Grant-Objekt in der UpdateReimbusementMonths Methode. Wenn ich das getan hätte, müsste ich etwas anderes herausfinden, da TryUpdateModel anscheinend den Validierungsprozess auslöst.

0

Es arbeitet nach documentation

In AddGrant Methode Sie Grant-Objekt Mitteilung verfassen, so dass es die Validierung nach dem Auto-Bindung nicht tun, bevor es irgendeinen Code in Ihrer Aktion-Methode ausführt.

-> Entweder müssen Sie Grant mit Erstattungen aktualisieren, bevor Sie die fließende Validierung veröffentlichen oder entfernen, und diese Validierung manuell in der Aktionsmethode durchführen.

-> Eine andere Option ist das Schreiben einer benutzerdefinierten Validator Interceptors und Grant Artikel mit Erstattungen in BeforeMvcValidation Methode zu aktualisieren. (Dies kann ein Hack sein und nicht ideal sein)

Verwandte Themen