如何在运行时设置RegularExpression数据注释的正则表达式参数?

Mar*_*ell 18 regex validation dynamic data-annotations asp.net-mvc-3

我们管理几个ASP.NET MVC客户端网站,它们都使用如下的数据注释来验证客户电子邮件地址(为了便于阅读,我没有在此处包含正则表达式):

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

我想要做的是集中这个正则表达式,这样如果我们对它进行更改,所有站点都会立即进行更改,我们不必在每个站点中手动更改它.

问题是数据注释的正则表达式参数必须是常量,所以我不能在运行时分配我从配置文件或数据库中检索到的值(这是我的第一个想法).

任何人都可以帮助我找到一个聪明的解决方案 - 或者失败,这是一种可以实现相同目标的替代方法吗?或者这只是要求我们编写一个专业的自定义验证属性,它将接受非常量值?

Ian*_*dge 30

最简单的方法是编写一个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})?$";
        }
    }
Run Code Online (Sandbox Code Playgroud)

这样,您仍然可以使用内置的Regex验证,但您可以自定义它.你只需使用它就像:

[Email(ErrorMessage = "Please use a valid email address")]
Run Code Online (Sandbox Code Playgroud)

最后,要使客户端验证工作,您只需在您的Application_Start方法中添加以下内容Global.asax,告诉MVC对此验证器使用正常的正则表达式验证:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter));
Run Code Online (Sandbox Code Playgroud)