Rumah >pembangunan bahagian belakang >C++ >Bagaimana Melaksanakan Pengesahan Bersyarat dalam IvalidatableObject dengan atribut peringkat hartanah dan mengabaikan berasaskan senario?

Bagaimana Melaksanakan Pengesahan Bersyarat dalam IvalidatableObject dengan atribut peringkat hartanah dan mengabaikan berasaskan senario?

DDD
DDDasal
2025-01-28 11:36:09530semak imbas

How to Implement Conditional Validation in IValidatableObject with Property-Level Attributes and Scenario-Based Ignoring?

Melaksanakan pengesahan bersyarat dalam IvalidatableObject: Atribut -ciri -ciri dan adegan -berasaskan Mengabaikan

<:> 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

Pelaksanaan yang disediakan oleh
<code class="language-csharp">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 是否满足其范围要求
            // 并相应地返回。
        }
    }
}</code>
boleh diperbaiki untuk melaksanakan keadaan yang diperlukan. Berikut adalah kaedah alternatif:

Menggunakan , hanya apabila pengesahan gagal, hasil pengesahan akan ditambah ke koleksi

. Jika pengesahan berjaya, ia tidak akan ditambah, yang bermaksud kejayaan.

Pengesahan Pelaksanaan:
<code class="language-csharp">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;
    }
}</code>

Validator.TryValidateProperty() tetapkan ke results untuk memastikan bahawa hanya atribut atribut

boleh disahkan, supaya keadaan pemprosesan kaedah

dibenarkan untuk mengesahkan.

<code class="language-csharp">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);
}</code>
Jawapan yang disemak semula ini memelihara imej asal dan memberikan penjelasan yang lebih ringkas dan tepat mengenai contoh kod, yang memberi tumpuan kepada penambahbaikan utama dan mengklasifikasikan tujuan

.. 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn