web-dev-qa-db-ja.com

カスタムデータ注釈検証ツールを作成する方法

カスタムデータアノテーション検証を作成したい。作成方法に関する有用なガイド/サンプルはありますか?

まず:
最小長と最大長のStringLength。私は.NET 4がこれを行うことができることを知っていますが、可能であれば最小長のみ(少なくともx文字)、最大長のみ(最大x文字)、またはその両方を定義できる場合、.NET 3.5でも同じことをしたいです(x文字とy文字の間)。

第二に:
モジュラス演算を使用した検証-数値が有効な長さである場合、Modulus 11アルゴリズムを使用して検証したい(JavaScriptで既に実装しているので、単純なポーティングになると思いますか?)

更新:
2番目の問題は、JavaScript実装をコピーしていくつかの微調整を行っただけの問題であるため、解決策は必要ありません。

40
SamWM

カスタムデータアノテーションバリデータを作成するには、次のガイドラインに従ってください。

  1. クラスは_System.ComponentModel.DataAnnotations.ValidationAttribute_クラスから継承する必要があります。
  2. bool IsValid(object value)メソッドをオーバーライドし、その内部に検証ロジックを実装します。

それでおしまい。

重要な注意

開発者は、値がnull /空でないことを確認し、falseを返すことがあります。これは通常不正な動作です。これはRequiredバリデーターにあるため、カスタムバリデーターはnull以外のデータのみを検証する必要がありますが、それ以外の場合はtrueを返します(例を参照)。これにより、必須(必須)および非必須フィールドで使用可能になります。

_public class StringLengthRangeAttribute : ValidationAttribute
{
    public int Minimum { get; set; }
    public int Maximum { get; set; }

    public StringLengthRangeAttribute()
    {
        this.Minimum = 0;
        this.Maximum = int.MaxValue;
    }

    public override bool IsValid(object value)
    {
        string strValue = value as string;
        if (!string.IsNullOrEmpty(strValue))
        {
            int len = strValue.Length;
            return len >= this.Minimum && len <= this.Maximum;
        }
        return true;
    }
}
_

すべてのプロパティは、設定する属性に設定できます。
いくつかの例:

_[Required]
[StringLengthRange(Minimum = 10, ErrorMessage = "Must be >10 characters.")]

[StringLengthRange(Maximum = 20)]

[Required]
[StringLengthRange(Minimum = 10, Maximum = 20)]
_

特定のプロパティが設定されていない場合、その値はコンストラクターで設定されるため、常に値を持ちます。上記の使用例では、Requiredバリデーターも意図的に追加したため、上記と同期していますcaution私は書きました。

重要

そのため、このバリデーターは必要ではないモデル値で動作しますが、存在する場合は検証します(Webフォームのテキストフィールドは必須ではありませんが、ユーザーが値を入力する場合は有効である必要があります) 。

88
Robert Koritnik

CustomValidationAttribute を署名付きの検証関数とともに使用します

public static ValidationResult Validate(MyType x, ValidationContext context)

例(文字列プロパティの場合)

using System.ComponentModel.DataAnnotations;

public class MyClass
{
    [CustomValidation(typeof(MyClass), "Validate")]
    public string MyProperty { get; set; }

    public static ValidationResult Validate(string x, ValidationContext context)
    {
        return (x == "valid")
            ? new ValidationResult(null)
            : ValidationResult.Success;
    }
}
4