Akıcı Doğrulamayı Kullanan Koşullu Doğrulama


86

İhtiyacım olan şey, diğer alanların doldurulup doldurulmadığına bağlı olarak alanları koşullu olarak doğrulamanın bir yolu.

Örn. Bir açılır listem ve ilişkili bir tarih alanım var. Alanlardan hiçbiri ayarlanmadıysa, form doğrulamadan geçmelidir. Ancak, iki alandan biri ayarlanmış ancak diğeri ayarlanmamışsa, diğer alanın ayarlanmasını gerektirecek şekilde doğrulama çalışmalıdır.

Özel doğrulama sınıfları yazdım ama görünüşe göre tek alanlar üzerinde doğrulanıyor. Yerleşik doğrulayıcıları kullanarak ihtiyacım olan doğrulamayı ayarlamanın bir yolu var mı? Değilse, özel bir doğrulayıcı kullanarak iki alanı birbirine bağlamanın iyi bir yolu var mı?

Yanıtlar:


131

Akıcı doğrulama koşullu doğrulamayı destekler; ikincil alanın değerini kontrol etmek için yalnızca When yan tümcesini kullanın:

https://fluentvalidation.net/start#conditions

Ne Zaman / Olmazsa ile bir koşul belirtme Ne Zaman ve Olmadıysa yöntemleri, kuralın ne zaman yürütülmesi gerektiğini kontrol eden koşulları belirtmek için kullanılabilir. Örneğin, CustomerDiscount özelliğindeki bu kural yalnızca IsPreferredCustomer true olduğunda çalıştırılır:

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

Unless yöntemi, When kelimesinin tam tersidir.

NotEmpty koşulunda çalışan özel bir doğrulayıcı tanımlamak için .SetValidator işlemini de kullanabilirsiniz.

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

Birden çok kural için aynı koşulu belirtmeniz gerekiyorsa, kuralın sonunda When çağrısını zincirlemek yerine en üst düzey When yöntemini çağırabilirsiniz:

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

Bu sefer koşul her iki kurala da uygulanacaktır. Ayrıca, Aksi takdirde koşulla eşleşmeyen kuralları çağıran bir çağrıyı zincirleyebilirsiniz:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.