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?

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);
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.