„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Implementieren Sie IvalidatableObject -Bedingungsverifizierung: Attributebene und Szenario -Unwissenheit

Implementieren Sie IvalidatableObject -Bedingungsverifizierung: Attributebene und Szenario -Unwissenheit

Gepostet am 2025-04-16
Durchsuche:623

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

implementieren Sie die bedingte Überprüfung in IvalidatableObject: Eigenschaften auf Attributebene und szenariobasierte Ignoranz

Frage:

Ich weiß, dass ivalidableObject verwendet werden kann, um die Objektvalidierung beim Vergleich von Eigenschaften durchzuführen. Ich möchte jedoch Eigenschaften verwenden, um eine einzelne Eigenschaft zu validieren, und in einigen Szenarien, die bestimmte Eigenschaften ignorieren, fehlschlagen. Ist meine folgende Implementierung falsch?

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 Validate(ValidationContext validationContext)
    {
        if (!this.Enable)
        {
            // 在此处返回有效结果。
            // 如果整个对象未“启用”,我不关心 Prop1 和 Prop2 是否超出范围
        }
        else
        {
            // 在此处检查 Prop1 和 Prop2 是否满足其范围要求
            // 并相应地返回。
        }
    }
}

Antwort:

Die bereitgestellte Implementierung kann verbessert werden, um die erforderliche bedingte Überprüfung zu erreichen. Hier ist eine Alternative:

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 Validate(ValidationContext validationContext)
    {
        var results = new List();
        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;
    }
}

mit validator.tryvalidateProperty () wird das -Ergebnis in die Sammlung nur dann hinzugefügt, wenn die Überprüfung fehlschlägt. Wenn die Überprüfung erfolgreich ist, wird nichts hinzugefügt, was auf Erfolg hinweist.

Ausführen von Überprüfung:

public void DoValidation()
{
    var toValidate = new ValidateMe()
    {
        Enable = true,
        Prop1 = 1,
        Prop2 = 2
    };

    bool validateAllProperties = false;

    var results = new List();

    bool isValid = Validator.TryValidateObject(
        toValidate,
        new ValidationContext(toValidate, null, null),
        results,
        validateAllProperties);
}

einstellen validateAllProperties an false stellt sicher, dass nur Eigenschaften mit der [erforderlichen] ordnungsgemäß veraltet sind, wobei die iValidoBject.validat () zuzulassen, um eine bedingte Validierung zu verarbeiten.

Diese überarbeitete Antwort behält das Originalbild bei und liefert eine prägnantere und genauere Erklärung des Codebeispiels, wobei der Schwerpunkt auf die Schlüsselverbesserungen und die Klärung des Zwecks von validateAllproperties wird. Die Codeblöcke sind auch zum besseren Lesen formatiert.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3