Fluent Validation을 사용한 조건부 검증


86

내가 필요한 것은 다른 필드가 채워져 있는지 여부에 따라 필드를 조건부로 검증하는 방법입니다.

전의. 관련된 드롭 다운 및 날짜 필드가 있습니다. 필드가 설정되지 않은 경우 양식은 유효성 검사를 통과해야합니다. 그러나 두 필드 중 하나가 설정되었지만 다른 필드가 설정되지 않은 경우 유효성 검사가 실행되어 다른 필드를 설정해야합니다.

사용자 지정 유효성 검사 클래스를 작성했지만 단일 필드에서 유효성을 검사하는 것 같습니다. 내장 된 유효성 검사기를 사용하여 필요한 유효성 검사를 설정하는 방법이 있습니까? 그렇지 않은 경우 사용자 지정 유효성 검사기를 사용하여 두 필드를 연결하는 좋은 방법이 있습니까?

답변:


131

Fluent 유효성 검사는 조건부 유효성 검사를 지원합니다. When 절을 사용하여 보조 필드의 값을 확인하면됩니다.

https://fluentvalidation.net/start#conditions

When / Unless를 사용하여 조건 지정 When 및 Unless 메서드를 사용하여 규칙을 실행할시기를 제어하는 ​​조건을 지정할 수 있습니다. 예를 들어 CustomerDiscount 속성에 대한이 규칙은 IsPreferredCustomer가 true 인 경우에만 실행됩니다.

RuleFor(customer => customer.CustomerDiscount)
    .GreaterThan(0)
    .When(customer => customer.IsPreferredCustomer);

Unless 방법은 단순히 When의 반대입니다.

.SetValidator 작업을 사용하여 NotEmpty 조건에서 작동하는 사용자 지정 유효성 검사기를 정의 할 수도 있습니다.

RuleFor(customer => customer.CustomerDiscount)
    .GreaterThan(0)
    .SetValidator(New MyCustomerDiscountValidator);

여러 규칙에 대해 동일한 조건을 지정해야하는 경우 규칙 끝에서 When 호출을 연결하는 대신 최상위 When 메서드를 호출 할 수 있습니다.

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
});

이번에는 조건이 두 규칙 모두에 적용됩니다. 조건과 일치하지 않는 규칙을 호출하는 else 호출을 연결할 수도 있습니다.

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.