2016-06-23 1 views
0

J'ai cette règle de validation couramment:FluentValidation régnerez affectée par Lorsque la condition qui suit une autre doit se prononcer

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"); 

Comme vous pouvez le voir, il y a 3 règles de MUST. Les 2 premiers sont liés à la condition Quand. Le problème que j'ai est, la seconde Lorsque la condition affecte la première règle de Must. Par exemple, si tvm.Task.Instructed est faux, et Deadline entré est 2016-06-22 (et en tenant compte du fait que la date actuelle est 2016-06-23) je m'attendrais à recevoir le message Deadline can't be earlier than today. Mais je ne reçois pas ce message parce que la seconde Lorsque vérifie si tvm.Task.Instructed est vrai et retourne false. Il semble donc que la condition affecte non seulement la règle qui en découle. Je voudrais vraiment écrire ces règles couramment une ligne. Est-ce possible ou je n'ai pas d'autre choix que de les définir séparément.

Répondre

1

Eh bien, par défaut, les conditions When s'appliquent à tous les validateurs.

Voir le code source de la méthode d'extension When, vous avez un paramètre avec cette valeur par défaut.

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); 
     } 

changer donc votre When, ajoutant ApplyConditionTo.CurrentValidator

ce qui devrait être ok (testé avec des données de l'échantillon)

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");