「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > ivalidatableObject条件の検証:属性レベルとシナリオ無知を実装します

ivalidatableObject条件の検証:属性レベルとシナリオ無知を実装します

2025-04-16に投稿されました
ブラウズ:836

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

vivalidatableObjectで条件付き検証を実装:属性レベルの特性とシナリオに基づく無知

質問:

私は、 ivalidableObject を使用して、プロパティを比較するときにオブジェクト検証を実行することができます。ただし、プロパティを使用して単一のプロパティを検証し、特定のプロパティが失敗するいくつかのシナリオで失敗したいと考えています。私の次の実装は正しくありませんか?

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 是否满足其范围要求
            // 并相应地返回。
        }
    }
}

答え:

提供された実装を改善して、必要な条件付き検証を実現できます。これが代替案です:

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;
    }
}

balidator.tryvalidateproperty()を使用することにより、結果に検証結果がコレクションに追加されます。検証が成功した場合、何も追加されず、成功を示します。

実行検証を実行:

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);
}

設定 validateallproperties から false 属性を持つプロパティのみが検証され、 ivalidateobject.validate()方法を条件付き検証を処理する方法を許可することを保証します。

この改訂された回答は、元の画像を維持し、コードの例のより簡潔で正確な説明を提供し、重要な改善に焦点を当て、 validateallproperties の目的を明確にします。コードブロックも、より良い読み取りのためにフォーマットされています。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3