การตรวจสอบเงื่อนไขโดยใช้ Fluent Validation


86

สิ่งที่ฉันต้องการคือวิธีตรวจสอบฟิลด์ตามเงื่อนไขขึ้นอยู่กับว่ามีการกรอกข้อมูลในฟิลด์อื่นหรือไม่

เช่น ฉันมีดรอปดาวน์และฟิลด์วันที่ที่เกี่ยวข้อง หากไม่มีการตั้งค่าช่องใดเลยฟอร์มควรผ่านการตรวจสอบความถูกต้อง อย่างไรก็ตามหากมีการตั้งค่าหนึ่งในสองฟิลด์ แต่อีกฟิลด์หนึ่งไม่ได้การตรวจสอบความถูกต้องควรเริ่มทำงานโดยต้องตั้งค่าฟิลด์อื่น

ฉันได้เขียนคลาสการตรวจสอบความถูกต้องที่กำหนดเองแล้ว แต่ดูเหมือนว่าจะถูกตรวจสอบในช่องเดียว มีวิธีตั้งค่าการตรวจสอบความถูกต้องที่ฉันต้องการโดยใช้ตัวตรวจสอบความถูกต้องในตัวหรือไม่? ถ้าไม่มีวิธีที่ดีในการเชื่อมต่อสองฟิลด์โดยใช้โปรแกรมตรวจสอบความถูกต้องแบบกำหนดเองหรือไม่?

คำตอบ:


131

การตรวจสอบอย่างคล่องแคล่วรองรับการตรวจสอบตามเงื่อนไขเพียงใช้คำสั่ง When เพื่อตรวจสอบค่าของฟิลด์รอง:

https://fluentvalidation.net/start#conditions

การระบุเงื่อนไขด้วยเมธอดWhen / เว้นแต่สามารถใช้เมธอดเมื่อใดและเว้นเสียเพื่อระบุเงื่อนไขที่ควบคุมเมื่อกฎควรดำเนินการ ตัวอย่างเช่นกฎนี้ในคุณสมบัติ CustomerDiscount จะดำเนินการก็ต่อเมื่อ IsPreferredCustomer เป็นจริง:

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

วิธีการยกเว้นนั้นตรงกันข้ามกับเมื่อ

คุณอาจสามารถใช้การดำเนินการ. setValidator เพื่อกำหนดตัวตรวจสอบความถูกต้องแบบกำหนดเองที่ทำงานบนเงื่อนไข NotEmpty

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

หากคุณต้องการระบุเงื่อนไขเดียวกันสำหรับกฎหลายข้อคุณสามารถเรียกใช้เมธอด When ระดับบนสุดแทนการผูกโซ่เมื่อโทรเมื่อสิ้นสุดกฎ:

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

คราวนี้เงื่อนไขจะถูกนำไปใช้กับกฎทั้งสอง คุณยังสามารถต่อสายเป็นมิฉะนั้นจะเรียกกฎที่ไม่ตรงกับเงื่อนไข:

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.