我们管理着多个ASP.NET MVC客户端网站,它们都使用如下数据注释来验证客户的电子邮件地址(为便于阅读,我这里未包括正则表达式):
[Required(ErrorMessage="Email is required")]
[RegularExpression(@"MYREGEX", ErrorMessage = "Email address is not valid")]
public string Email { get; set; }
我想做的就是集中化此正则表达式,这样,如果我们对其进行更改,所有站点都会立即将其选中,而不必在每个站点中都进行手动更改。
问题在于数据注释的regex参数必须是一个常量,因此我无法分配在运行时从配置文件或数据库中检索到的值(这是我的第一个想法)。
有人能为我提供一个解决这个问题的灵巧解决方案的方法吗?或者是失败的替代方法,它可以实现相同的目标?还是这仅要求我们编写一个接受非恒定值的专家自定义验证属性?
最佳答案
最简单的方法是编写一个自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));
关于regex - 如何在运行时设置正则表达式数据注释正则表达式参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8431007/