Как я могу задать аргумент регулярного выражения аннотации данных регулярного выражения во время выполнения?

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

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

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Затем вы можете настроить эту вещь, чтобы вытащить регулярное выражение из параметра реестра... config file... database... и т.д. и т.д.

Практическое руководство. Настройка проверки полей данных в модели данных с использованием пользовательских настроек

Ответ 4

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