web-dev-qa-db-ja.com

実行時に正規表現データ注釈の正規表現引数を設定するにはどうすればよいですか?

いくつかのASP.NETMVCクライアントWebサイトを管理しています。これらはすべて、次のようなデータ注釈を使用して顧客の電子メールアドレスを検証します(読みやすくするために、ここには正規表現を含めていません)。

[Required(ErrorMessage="Email is required")]
[RegularExpression(@"MYREGEX", ErrorMessage = "Email address is not valid")]
public string Email { get; set; }

私がやりたいのは、この正規表現を一元化して、変更を加えた場合にすべてのサイトがすぐにそれを取得し、各サイトで手動で変更する必要がないようにすることです。

問題は、データ注釈の正規表現引数が定数でなければならないため、実行時に構成ファイルまたはデータベースから取得した値を割り当てることができないことです(これは私の最初の考えでした)。

誰かがこれに対する巧妙な解決策で私を助けることができますか、またはそれを失敗すると、同じ目標を達成するために働く代替アプローチですか?それとも、これは、非定数値を受け入れるスペシャリストのカスタム検証属性を作成する必要があるだけですか?

18
Mark Bell

最も簡単な方法は、ValidationAttributeから継承するカスタムRegularExpressionAttributeを作成することです。つまり、次のようになります。

public class EmailAttribute : RegularExpressionAttribute
    {
        public EmailAttribute()
            : base(GetRegex())
        { }

        private static string GetRegex()
        {
            // TODO: Go off and get your RegEx here
            return @"^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$";
        }
    }

そうすれば、組み込みの正規表現検証の使用を維持できますが、カスタマイズすることができます。あなたは単にそれを次のように使うでしょう:

[Email(ErrorMessage = "Please use a valid email address")]

最後に、クライアント側の検証を機能させるには、Application_Start内のGlobal.asaxメソッドに以下を追加して、このバリデーターに通常の正規表現検証を使用するようにMVCに指示します。

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter));
30
Ian Routledge

本当に正規表現をデータベース/設定ファイルに入れたいですか、それとも単にそれらを一元化したいですか?正規表現をまとめたいだけの場合は、次のような定数を定義して使用できます。

public class ValidationRegularExpressions {
    public const string Regex1 = "...";
    public const string Regex2 = "...";
}

外部ファイルの正規表現を管理したい場合は、MSBuildタスクを記述して、本番用にビルドするときに置換を行うことができます。

実行時に検証正規表現を本当に変更したい場合は、次のような独自のValidationAttributeを定義します。

[RegexByKey("MyKey", ErrorMessage = "Email address is not valid")]
public string Email { get; set; }

書くのはほんの一片のコードです:

public class RegexByKeyAttribute : ValidationAttribute {
    public RegexByKey(string key) {
        ...
    }

    // override some methods
    public override bool IsValid(object value) {
        ...
    }
}

または単に:

public class RegexByKeyAttribute : RegularExpressionAttribute {
    public RegexByKey(string key) : base(LoadRegex(key)) { }

    // Be careful to cache the regex is this operation is expensive.
    private static string LoadRegex(string key) { ... }
}

お役に立てば幸いです: http://msdn.Microsoft.com/en-us/library/cc668224.aspx

3
Jeffrey Zhao

独自のValidationAttributeを作成してみませんか?

http://msdn.Microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.aspx

次に、レジストリ設定...構成ファイル...データベース...などから正規表現をプルするように構成できます。

方法:カスタムを使用してデータモデルのデータフィールド検証をカスタマイズする

2
John Sobolewski

チェックアウト ScotGuの[Email]属性 (ステップ4:カスタムの作成[Email]検証属性)。

2
Darin Dimitrov