Validasi Bersyarat menggunakan Validasi Lancar

86

Yang saya butuhkan adalah cara untuk memvalidasi bidang secara bersyarat bergantung pada apakah bidang lain diisi.

Ex. Saya memiliki dropdown dan bidang tanggal yang terkait. Jika tidak ada bidang yang ditetapkan maka formulir harus lulus validasi. Namun, jika salah satu dari dua bidang disetel tetapi yang lainnya tidak, validasi harus diaktifkan, mengharuskan bidang lain disetel.

Saya telah menulis kelas validasi khusus tetapi tampaknya itu memvalidasi pada satu bidang. Apakah ada cara untuk menyiapkan validasi yang saya perlukan menggunakan validator bawaan? Jika tidak, Adakah cara yang baik untuk menghubungkan dua bidang menggunakan validator khusus?

The Sheek Geek
sumber

Jawaban:

131

Validasi lancar mendukung validasi bersyarat, cukup gunakan klausa When untuk memeriksa nilai bidang sekunder:

https://fluentvalidation.net/start#conditions

Menentukan kondisi dengan When / Kecuali Metode When dan Unless dapat digunakan untuk menentukan kondisi yang mengontrol kapan aturan harus dijalankan. Misalnya, aturan ini pada properti CustomerDiscount hanya akan dijalankan jika IsPreferredCustomer benar:

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

Metode Kecuali adalah kebalikan dari When.

Anda mungkin juga dapat menggunakan operasi .SetValidator untuk menentukan validator kustom yang beroperasi pada kondisi NotEmpty.

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

Jika Anda perlu menetapkan kondisi yang sama untuk beberapa aturan, maka Anda dapat memanggil metode When tingkat atas alih-alih merangkai panggilan When di akhir aturan:

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

Kali ini, ketentuan tersebut akan diterapkan pada kedua aturan tersebut. Anda juga dapat menyambung panggilan ke Sebaliknya yang akan memanggil aturan yang tidak cocok dengan kondisi:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
Denis Pitcher
sumber