Как установить аргумент регулярного выражения аннотации данных RegularExpression во время выполнения? - PullRequest
16 голосов
/ 08 декабря 2011

Мы управляем несколькими клиентскими веб-сайтами ASP.NET MVC, все из которых используют аннотацию данных, подобную приведенной ниже, для проверки адресов электронной почты клиентов (здесь я не включил регулярное выражение для удобства чтения):

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

То, что я хотел бы сделать, это централизовать это регулярное выражение, чтобы, если мы внесем в него изменения, все сайты сразу его подберут, и нам не придется вручную изменять его в каждом.

Проблема в том, что аргумент regex аннотации данных должен быть константой, поэтому я не могу присвоить значение, которое я извлек из файла конфигурации или базы данных во время выполнения (что было моей первой мыслью).

Может ли кто-нибудь помочь мне с умным решением этого - или с ошибкой - альтернативным подходом, который будет работать для достижения той же цели? Или это просто требует от нас написания специального пользовательского атрибута проверки, который будет принимать непостоянные значения?

Ответы [ 4 ]

28 голосов
/ 08 декабря 2011

Самый простой способ - написать пользовательский 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})?$";
        }
    }

Таким образом, вы все еще сохраняете использование встроенной проверки Regex, но вы можетенастроить его.Вы бы просто использовали его как:

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

Наконец, чтобы перейти к проверке на стороне клиента, вы просто добавили бы следующее в ваш Application_Start метод в Global.asax, чтобы сообщить MVCиспользуйте для этого валидатора обычное регулярное выражение:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter));
3 голосов
/ 08 декабря 2011

Вы действительно хотите поместить регулярное выражение в файл базы данных / конфигурации, или вы просто хотите централизовать их? Если вы просто хотите объединить регулярное выражение, вы можете просто определить и использовать константы, такие как

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

Возможно, вы хотите управлять регулярными выражениями во внешних файлах, вы можете написать задачу MSBuild для замены при сборке для production .

Если вы ДЕЙСТВИТЕЛЬНО хотите изменить регулярное выражение проверки во время выполнения, определите свой собственный атрибут 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

2 голосов
/ 08 декабря 2011

Оформить заказ Атрибут ScotGu [Email] (Шаг 4: Создание пользовательского [Email] атрибута проверки).

2 голосов
/ 08 декабря 2011

Почему бы просто не написать свой собственный атрибут Validation?

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

Затем вы можете настроить эту вещь для извлечения регулярных выражений из настроек реестра ... конфигурационного файла ... базы данных ... и т. Д.

Как: настроить проверку поля данных в модели данных, используя пользовательский

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...