[c#] Fluent Validation을 사용한 조건부 검증
내가 필요한 것은 다른 필드가 채워져 있는지 여부에 따라 필드를 조건부로 검증하는 방법입니다.
전의. 관련된 드롭 다운 및 날짜 필드가 있습니다. 필드가 설정되지 않은 경우 양식은 유효성 검사를 통과해야합니다. 그러나 두 필드 중 하나가 설정되었지만 다른 필드가 설정되지 않은 경우 유효성 검사가 실행되어 다른 필드를 설정해야합니다.
사용자 지정 유효성 검사 클래스를 작성했지만 단일 필드에서 유효성을 검사하는 것 같습니다. 내장 된 유효성 검사기를 사용하여 필요한 유효성 검사를 설정하는 방법이 있습니까? 그렇지 않은 경우 사용자 지정 유효성 검사기를 사용하여 두 필드를 연결하는 좋은 방법이 있습니까?
답변
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);
});