Heim > Backend-Entwicklung > C++ > So implementieren Sie eine bedingte Validierung in IvalIdatableObject mit Attributen auf Eigenschaftenebene und szenariobasiertem Ignorieren?

So implementieren Sie eine bedingte Validierung in IvalIdatableObject mit Attributen auf Eigenschaftenebene und szenariobasiertem Ignorieren?

DDD
Freigeben: 2025-01-28 11:36:09
Original
564 Leute haben es durchsucht

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

Umsetzung der bedingten Überprüfung in IvalIdatableObject: Attribut -Level -Eigenschaften und Szenen -basiertes Ignorieren

<:> Frage:

Ich weiß, dass beim Vergleich der Attribute zur Objektüberprüfung verwendet werden kann. Ich hoffe jedoch, Attribute zu verwenden, um ein einzelnes Attribut zu überprüfen und bestimmte Attribute in einigen Szenarien zu ignorieren. Ist meine Implementierung unten falsch?

Antwort: IValidatableObject

Die durch
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 是否满足其范围要求
            // 并相应地返回。
        }
    }
}
Nach dem Login kopieren
bereitgestellte Implementierung kann verbessert werden, um die erforderlichen Bedingungen umzusetzen. Das Folgende ist eine alternative Methode:

verwendet <只>, nur wenn die Überprüfung fehlschlägt, wird das Überprüfungsergebnis zur

-Kollektion hinzugefügt. Wenn die Überprüfung erfolgreich ist, wird sie nicht hinzugefügt, was Erfolg bedeutet.

Ausführungsüberprüfung:
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;
    }
}
Nach dem Login kopieren

Validator.TryValidateProperty() setzen Sie <置> auf results, um sicherzustellen, dass nur die Attribute von

Attributen überprüft werden können, sodass die Verarbeitungsbedingungen

Methoden überprüft werden können.

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);
}
Nach dem Login kopieren
Diese überarbeitete Antwort verwaltet das Originalbild und liefert eine prägnantere und genauere Erklärung des Codebeispiels, wobei sich die wichtigsten Verbesserungen konzentrieren und den Zweck von

klassifizieren. Die Codeblöcke sind auch für eine bessere Lesbarkeit formatiert >

Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine bedingte Validierung in IvalIdatableObject mit Attributen auf Eigenschaftenebene und szenariobasiertem Ignorieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage