ASP.NET MVC での条件付き検証の実装
ASP.NET MVC のデータ注釈は、モデル プロパティの検証を実行する便利な方法を提供します。ただし、フィールドの有効性が別のフィールドの値に依存する場合、条件付き検証ルールの実装が必要になる場合があります。
例: 条件付き必須フィールド
次のシナリオを考えてみましょう。「IsSenior」プロパティと説明を含む「Senior」プロパティを含む「person」モデルがあります。 「IsSenior」が true に設定されている場合にのみ、「Senior.Description」プロパティを必須フィールドにしたいと考えています。
データアノテーション方法
これは、データ注釈のみを使用した場合には不可能です。次のコードは、この制限を示しています:
<code class="language-csharp">public class Person { [Required(ErrorMessage = "*")] public string Name { get; set; } public bool IsSenior { get; set; } public Senior Senior { get; set; } } public class Senior { [Required(ErrorMessage = "*")] public string Description { get; set; } }</code>
IValidatableObject メソッド
ASP.NET MVC 3 では、IValidatableObject インターフェイスを使用した条件付き検証のためのより優れたソリューションが導入されています。モデルはこのインターフェイスを実装し、ValidationContext パラメーターを受け入れる Validate メソッドを提供する必要があります。このメソッドはカスタム検証ロジックを実行し、エラーが見つかった場合は ValidationResult オブジェクトのコレクションを返すことができます。
<code class="language-csharp">public class Person : IValidatableObject { public string Name { get; set; } public bool IsSenior { get; set; } public Senior Senior { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (IsSenior && String.IsNullOrEmpty(Senior?.Description)) yield return new ValidationResult("必须提供描述。"); } }</code>
IValidatableObject インターフェイスを実装することにより、「IsSenior」の値に基づいて条件付き検証を実行できるようになりました。 「IsSenior」が true の場合、「Senior.Description」プロパティは必須フィールドになります。
構文の改善 (C# 6.0 以降)
C# 6.0 以降では、式本体のメンバーを使用して Validate メソッドを簡略化できます。
<code class="language-csharp">public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) => IsSenior && String.IsNullOrEmpty(Senior?.Description) ? new[] { new ValidationResult("必须提供描述。") } : Enumerable.Empty<ValidationResult>();</code>
上記の方法により、ASP.NET MVC で条件付き検証を効果的に実装できます。 Senior.Description に安全にアクセスし、null 参照例外を回避するには、null 条件演算子 (?.) を使用することに注意してください。
以上がASP.NET MVCで条件付き検証を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。