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
DDDOriginal
2025-01-28 11:36:09558Durchsuche

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
<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>
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:
<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() 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.

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

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