Maison >développement back-end >C++ >Comment implémenter la validation conditionnelle dans ivalidAtableObject avec les attributs au niveau de la propriété et l'ignorance basée sur le scénario?

Comment implémenter la validation conditionnelle dans ivalidAtableObject avec les attributs au niveau de la propriété et l'ignorance basée sur le scénario?

DDD
DDDoriginal
2025-01-28 11:36:09532parcourir

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

Implémentez la vérification conditionnelle dans ivalidAtableObject: caractéristiques de niveau d'attribut et ignoration de la scène

Question:

Je sais que peut être utilisé pour la vérification des objets lors de la comparaison des attributs. Cependant, j'espère utiliser des attributs pour vérifier un seul attribut et ignorer des attributs spécifiques dans certains scénarios. Mon implémentation ci-dessous est-elle incorrecte?

Réponse: IValidatableObject

La mise en œuvre fournie par
<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>
peut être améliorée pour mettre en œuvre les conditions requises. Ce qui suit est une méthode alternative:

utilise , uniquement lorsque la vérification échoue, le résultat de vérification sera ajouté à la collection

. Si la vérification est réussie, elle ne sera pas ajoutée, ce qui signifie le succès.

Vérification de l'exécution:
<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() Définir sur results pour s'assurer que seuls les attributs d'attributs

peuvent être vérifiés, de sorte que les conditions de traitement de la méthode

sont autorisées à vérifier.

<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>
Cette réponse révisée maintient l'image d'origine et fournit une explication plus concise et précise de l'exemple de code, en se concentrant sur les améliorations clés et en classant le but de

.. les blocs de code sont également formatés pour une meilleure lisibilité. >

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn