Saya mengerti bahwa IValidatableObject
ini digunakan untuk memvalidasi objek dengan cara yang memungkinkan satu membandingkan properti terhadap satu sama lain.
Saya masih ingin memiliki atribut untuk memvalidasi properti individual, tetapi saya ingin mengabaikan kegagalan pada beberapa properti dalam kasus tertentu.
Apakah saya mencoba menggunakannya secara tidak benar dalam kasus di bawah ini? Jika tidak, bagaimana saya menerapkan ini?
public class ValidateMe : IValidatableObject
{
[Required]
public bool Enable { get; set; }
[Range(1, 5)]
public int Prop1 { get; set; }
[Range(1, 5)]
public int Prop2 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!this.Enable)
{
/* Return valid result here.
* I don't care if Prop1 and Prop2 are out of range
* if the whole object is not "enabled"
*/
}
else
{
/* Check if Prop1 and Prop2 meet their range requirements here
* and return accordingly.
*/
}
}
}
Kutipan dari Posting Blog Jeff Handley tentang Objek Validasi dan Properti dengan Validator :
Ini menunjukkan bahwa apa yang Anda coba lakukan tidak akan berhasil karena validasi akan dibatalkan pada langkah # 2. Anda bisa mencoba membuat atribut yang mewarisi dari bawaan dan secara khusus memeriksa keberadaan properti yang diaktifkan (melalui antarmuka) sebelum melakukan validasi normal. Atau, Anda bisa meletakkan semua logika untuk memvalidasi entitas dalam
Validate
metode.sumber
Hanya untuk menambahkan beberapa poin:
Karena
Validate()
metode tanda tangan kembaliIEnumerable<>
, yangyield return
dapat digunakan untuk menghasilkan hasil malas - ini bermanfaat jika beberapa pemeriksaan validasi IO atau CPU intensif.Selain itu, jika Anda menggunakan
MVC ModelState
, Anda dapat mengonversi kegagalan hasil validasi menjadiModelState
entri sebagai berikut (ini mungkin berguna jika Anda melakukan validasi dalam binder model kustom ):sumber
Saya menerapkan kelas abstrak penggunaan umum untuk validasi
sumber
Masalah dengan jawaban yang diterima adalah bahwa itu sekarang tergantung pada pemanggil untuk objek yang akan divalidasi dengan benar. Saya akan menghapus RangeAttribute dan melakukan validasi rentang di dalam metode Validasi atau saya akan membuat atribut kustom subclassing RangeAttribute yang mengambil nama properti yang diperlukan sebagai argumen pada konstruktor.
Sebagai contoh:
sumber
Saya menyukai jawaban cocogza kecuali basis panggilan itu. IsValid menghasilkan pengecualian stack overflow karena akan memasukkan kembali metode IsValid berulang kali. Jadi saya memodifikasinya untuk jenis validasi tertentu, dalam kasus saya itu untuk alamat email.
Ini bekerja lebih baik! Itu tidak crash dan menghasilkan pesan kesalahan yang bagus. Semoga ini bisa membantu seseorang!
sumber
Hal yang saya tidak suka tentang iValidate adalah sepertinya hanya menjalankan SETELAH semua validasi lainnya.
Selain itu, setidaknya di situs kami, itu akan berjalan lagi selama upaya penyelamatan. Saya sarankan Anda cukup membuat fungsi dan menempatkan semua kode validasi Anda di dalamnya. Sebagai alternatif untuk situs web, Anda dapat memiliki validasi "khusus" di dalam pengontrol setelah model dibuat. Contoh:
sumber