2016-06-23 11 views
0

Ich habe Muss beherrschen diese fließend Gültigkeitsregel bekam:FluentValidation Muss von Wenn Krankheit betroffen Regel, dass ein anderer folgt

RuleForEach(tvm => tvm.Task.Executors).Cascade(CascadeMode.StopOnFirstFailure).Must((tvm, exec) => { return exec.Deadline.HasValue ? exec.Deadline.Value.Date >= DateTime.Now.Date : true; }). 
     When(tvm=>!tvm.Task.Instructed). 
     WithMessage("Deadline can't be earlier than today"). 
     Must((tvm,exec)=>{ return exec.Deadline.HasValue ? exec.Deadline.Value.Date >= tvm.Task.InstructDate.Value.Date : true; }). 
     When(tvm=>tvm.Task.Instructed). 
     WithMessage("Deadline can't be earlier than the instructed date"). 
     Must((tvm, exec) => { return exec.InstructionId == (int)Instructions.TakeOwnership ? exec.Deadline != null : true; }). 
     WithMessage("Enter deadline"); 

Wie Sie sehen können, gibt es 3 gibt es Regeln. Die ersten beiden sind an die Wann-Bedingung gebunden. Das Problem, das ich habe, ist die zweite Wenn Bedingung die erste Muss-Regel betrifft. Zum Beispiel, wenn tvm.Task.Instructed falsch ist, und Deadline eingegeben ist 2016-06-22 (und unter Berücksichtigung, dass das aktuelle Datum 2016.06.23 ist) würde ich erwarten, Deadline can't be earlier than today Nachricht an receieve. Aber ich bekomme diese Nachricht nicht, weil die zweite When prüft, ob tvm.Task.Instructed wahr ist und false zurückgibt. So scheint es, wenn sich die Bedingung nicht nur auf die Regel auswirkt. Ich würde diese Regeln wirklich fließend in einer Zeile schreiben wollen. Ist das möglich oder habe ich keine andere Wahl, als sie separat zu definieren?

Antwort

1

Nun, standardmäßig die When Bedingungen für alle Validatoren gelten.

Siehe der Quellcode der When Erweiterungsmethode, haben Sie einen Parameter mit diesem Standardwert bekommen.

public static IRuleBuilderOptions<T, TProperty> Unless<T, TProperty>(this IRuleBuilderOptions<T, TProperty> rule, Func<T, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) { 
      predicate.Guard("A predicate must be specified when calling Unless"); 
      return rule.When(x => !predicate(x), applyConditionTo); 
     } 

So Ihre When, ändern ApplyConditionTo.CurrentValidator

So Zugabe dieser (getestet mit einigen Beispieldaten)

RuleForEach(tvm => tvm.Task.Executors). 
     Cascade(CascadeMode.StopOnFirstFailure). 
     Must((tvm, exec) => { return exec.Deadline.HasValue ? exec.Deadline.Value.Date >= DateTime.Now.Date : true; }). 
     When(tvm=>!tvm.Task.Instructed, ApplyConditionTo.CurrentValidator). 
     WithMessage("Deadline can't be earlier than today"). 
     Must((tvm,exec)=>{ return exec.Deadline.HasValue ? exec.Deadline.Value.Date >= tvm.Task.InstructDate.Value.Date : true; }). 
     When(tvm=>tvm.Task.Instructed, ApplyConditionTo.CurrentValidator). 
     WithMessage("Deadline can't be earlier than the instructed date"). 
     Must((tvm, exec) => { return exec.InstructionId == (int)Instructions.TakeOwnership ? exec.Deadline != null : true; }). 
     WithMessage("Enter deadline"); 
ok sein sollte