我们管理多个ASP.NET MVC客户端网站,它们都使用如下所示的数据注释来验证客户电子邮件地址(为了便于阅读,我没有在此处包含正则表达式):
[Required(ErrorMessage="Email is required")]
[RegularExpression(@"MYREGEX", ErrorMessage = "Email address is not valid")]
public string Email { get; set; }
我想要做的是集中这个正则表达式,这样如果我们对它进行更改,所有站点都会立即进行更改,我们不必在每个站点中手动更改它。
问题是数据注释的正则表达式参数必须是常量,所以我不能在运行时分配我从配置文件或数据库中检索到的值(这是我的第一个想法)。
任何人都可以帮助我找到一个聪明的解决方案 - 或者说失败了,一种可以实现同一目标的替代方法吗?或者这只是要求我们编写一个专业的自定义验证属性,它将接受非常数值?
答案 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) { ... }
}
答案 2 :(得分:2)
为什么不写自己的ValidationAttribute?
然后你可以配置那个东西从注册表设置中拉出正则表达式...配置文件...数据库......等...等等。
How to: Customize Data Field Validation in the Data Model Using Custom
答案 3 :(得分:2)
结帐ScotGu's [Email]
attribute(第4步:创建自定义[Email]
验证属性)。