2015-06-11 3 views
2

У меня есть следующий код для проверки объекта:проверить еще одно правило с fluentvalidation

public class AffiliateValidator : AbstractValidator<Affiliate> 
    { 
    public AffiliateValidator() 
    { 
     RuleFor(x => x.IBAN).SetValidator(new ValidIBAN()).Unless(x => String.IsNullOrWhiteSpace(x.IBAN)); 
    } 
    } 

И ValidIBAN() Код:

public class ValidIBAN : PropertyValidator 
{ 
    public ValidIBAN() 
     :base("IBAN \"{PropertyValue}\" not valid.") 
    { 

    } 

    protected override bool IsValid(PropertyValidatorContext context) 
    { 
     var iban = context.PropertyValue as string; 
     IBAN.IBANResult result = IBAN.CheckIban(iban, false); 
     return result.Validation == (IBAN.ValidationResult.IsValid); 
    } 

} 

}

Таким образом, метод CheckIBAN класса IBAN делает грязную работу.

Теперь мне нужно применить следующее правило для другого свойства: Если DirectDebit (bool) истинно, то IBAN не может быть пустым, а также он должен быть действительным.

Я могу это сделать:

RuleFor(x => x.DirectDebit).Equal(false).When(a => string.IsNullOrEmpty(a.IBAN)).WithMessage("TheMessage."); 

Но как я могу Вызывать другое правило, правило IBAN в этом случае для того, чтобы проверить, является или не является действительным?

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

@JohnSaunders: Извините. Я не уверен, что было опубликовано как название. Но будет иметь в виду в следующий раз. – Txaran

+0

"C# fluentvalidation проверить другое правило" –

ответ

0

Часто проблемы проще, чем кажется. Это решение, которое я принимаю, чтобы применить правило для поля DirectDebit.

RuleFor(x => x.DirectDebit).Must(HaveValidAccounts).When(x => x.DirectDebit) 
      .WithMessage("TheMessage"); 

и изменить правила для IBAN также:

RuleFor(x => x.IBAN).Must(IsValidIBAN) 
          .Unless(x => String.IsNullOrWhiteSpace(x.IBAN)) 
          .WithMessage("The IBAN \"{PropertyValue}\" is not valid."); 

... а потом:

private bool HaveValidAccounts(ViewModel instance, bool DirectDebit) 
    { 
     if (!DirectDebit) 
     { return true; } 

     bool CCCResult = IsValidCCC(instance.CCC); 
     bool IBANResult = IsValidIBAN(instance.IBAN); 

     return CCCResult || IBANResult; 
    } 

    private bool IsValidIBAN(string iban) 
    { 
     return CommonInfrastructure.Finantial.IBAN.CheckIban(iban, false).Validation == IBAN.ValidationResult.IsValid; 
    } 

трюк заключается в использовании параметра экземпляра Must(), чтобы сделать whetever Я хочу ,

 Смежные вопросы

  • Нет связанных вопросов^_^