0

データベースには、参照整合性のために使用するいくつかのコード テーブルがあります (emailTypes、phoneTypes、countryCodes、stateCodes など)。このアプリケーションでは、これらのテーブルを汎用リストにロードしてキャッシュします。現在、アプリケーションには、送信された値がハードコードされた値のリストにあるかどうかを確認するために、各リストのカスタム ValidationAttributes があります。これは、一般的なリスト、値を検索するプロパティ、および値のデータ型を取り、値がリストに存在する場合に有効を返す新しいカスタム validationAttribute で書き直すことができると思います。

まず、実行時にカスタム検証属性に入力されるコンパイル時のリストを使用できるかどうか疑問に思っています。

もしそうなら、誰かがこれに対する良い解決策をすでに思いついていますか? そうでない場合、回避策はありますか?

js 検証用に IClientValidatable を含める場合は、ボーナス ポイントを含めます (stackoverflow にボーナス ポイントがあるわけではありません)。

4

2 に答える 2

0

次のコードを使用して、中央の検証ロジックを実装できます

public abstract class GenericValidationAttribute:ValidationAttribute
{
    protected GenericValidationAttribute(DataValidationType dataValidationType)
    {
        ValidationType = dataValidationType;
    }

    protected DataValidationType ValidationType { get; set; }

    public override bool IsValid(object value)
    {
        switch (ValidationType)
        {
            case DataValidationType.Email:
                //Check if the value is in the built-in emails
                break;
            case DataValidationType.Phone:
                //Check if the value is in the phone list
                break;
        }

        return base.IsValid(value);
    }
}

public class EmailValidationAttribute : GenericValidationAttribute
{
    public EmailValidationAttribute() : base(DataValidationType.Email)
    {}

}


public enum DataValidationType
{
    Email,
    Phone,
    Country,
    State
}

検証ロジックをジェネリック検証属性に入れるだけで、他の特定の検証クラスがそれを継承します。

乾杯。

于 2014-04-29T05:23:22.653 に答える