ivalidatableObjectに条件付き検証を実装:属性レベルの特性とシーンベースの無視
質問:
属性を比較するときにオブジェクトの検証に使用できることを知っています。ただし、属性を使用して単一の属性を検証し、いくつかのシナリオで特定の属性を無視したいと考えています。以下の私の実装は正しくありませんか?
回答:IValidatableObject
必要な条件を実装するために、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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)
{
}
else
{
}
}
}
|
ログイン後にコピー
によって提供される実装を改善できます。以下は別の方法です:
<只>を使用します。検証が失敗した場合にのみ、検証結果が
コレクションに追加されます。検証が成功した場合、追加されないため、成功を意味します。
実行検証:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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;
}
}
|
ログイン後にコピー
Validator.TryValidateProperty()
set<置>set<置>toresults
を設定して、
属性の属性のみを検証できるようにし、
メソッド処理条件を検証できるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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);
}
|
ログイン後にコピー
この改訂された回答は、元の画像を維持し、コードの例をより簡潔で正確な説明を提供し、重要な改善に焦点を当て、
の目的に分類します>
以上がプロパティレベルの属性とシナリオベースの無視を使用して、ivalidatableObjectで条件付き検証を実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。