ivalidatableObjectに条件付き検証を実装:属性レベルの特性とシーンベースの無視
質問:
属性を比較するときにオブジェクトの検証に使用できることを知っています。ただし、属性を使用して単一の属性を検証し、いくつかのシナリオで特定の属性を無視したいと考えています。以下の私の実装は正しくありませんか?
回答:IValidatableObject
<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>によって提供される実装を改善できます。以下は別の方法です:
を使用します。検証が失敗した場合にのみ、検証結果が
コレクションに追加されます。検証が成功した場合、追加されないため、成功を意味します。実行検証:
<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()
setsettoresults
を設定して、
メソッド処理条件を検証できるようにします。
<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>この改訂された回答は、元の画像を維持し、コードの例をより簡潔で正確な説明を提供し、重要な改善に焦点を当て、
の目的に分類します>
以上がプロパティレベルの属性とシナリオベースの無視を使用して、ivalidatableObjectで条件付き検証を実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。