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

时间:2011-12-08 12:29:52

标签: regex asp.net-mvc-3 validation dynamic data-annotations

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

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

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

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

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

4 个答案:

答案 0 :(得分:27)

最简单的方法是编写一个继承自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对此验证器使用正常的正则表达式验证: / p>

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter));

答案 1 :(得分:3)

你真的想把正则表达式放在数据库/配置文件中,还是只想集中它们?如果你只想把正则表达式放在一起,你可以定义和使用像

这样的常量
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

答案 2 :(得分:2)

为什么不写自己的ValidationAttribute?

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

然后你可以配置那个东西从注册表设置中拉出正则表达式...配置文件...数据库......等...等等。

How to: Customize Data Field Validation in the Data Model Using Custom

答案 3 :(得分:2)

结帐ScotGu's [Email] attribute(第4步:创建自定义[Email]验证属性)。