<:> Soalan:
Saya tahu boleh digunakan untuk pengesahan objek apabila membandingkan atribut. Walau bagaimanapun, saya berharap dapat menggunakan atribut untuk mengesahkan atribut tunggal dan mengabaikan atribut tertentu dalam beberapa senario. Adakah pelaksanaan saya di bawah tidak betul?
Jawapan: IValidatableObject
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) { // 在此处返回有效结果。 // 如果整个对象未“启用”,我不关心 Prop1 和 Prop2 是否超出范围 } else { // 在此处检查 Prop1 和 Prop2 是否满足其范围要求 // 并相应地返回。 } } }
Menggunakan <只>, hanya apabila pengesahan gagal, hasil pengesahan akan ditambah ke koleksi
. Jika pengesahan berjaya, ia tidak akan ditambah, yang bermaksud kejayaan.Pengesahan Pelaksanaan:
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) { var results = new List<ValidationResult>(); if (this.Enable) { Validator.TryValidateProperty(this.Prop1, new ValidationContext(this, null, null) { MemberName = "Prop1" }, results); Validator.TryValidateProperty(this.Prop2, new ValidationContext(this, null, null) { MemberName = "Prop2" }, results); // 其他一些随机测试 if (this.Prop1 > this.Prop2) { results.Add(new ValidationResult("Prop1 必须大于 Prop2")); } } return results; } }
Validator.TryValidateProperty()
tetapkan <置> ke results
untuk memastikan bahawa hanya atribut atribut
dibenarkan untuk mengesahkan.
public void DoValidation() { var toValidate = new ValidateMe() { Enable = true, Prop1 = 1, Prop2 = 2 }; bool validateAllProperties = false; var results = new List<ValidationResult>(); bool isValid = Validator.TryValidateObject( toValidate, new ValidationContext(toValidate, null, null), results, validateAllProperties); }
.. Blok kod juga diformat untuk dibaca yang lebih baik >
Atas ialah kandungan terperinci Bagaimana Melaksanakan Pengesahan Bersyarat dalam IvalidatableObject dengan atribut peringkat hartanah dan mengabaikan berasaskan senario?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!