我们管理几个ASP.NET MVC客户端网站,它们都使用如下所示的数据注释来验证客户的电子邮件地址(我没有在这里包含正则表达式,以便可读性):
[required(ErrorMessage="Email is required")] [RegularExpression(@"MYREGEX",ErrorMessage = "Email address is not valid")] public string Email { get; set; }
我想做的是集中这个正则表达式,所以如果我们改变它,所有的站点立即拿起来,我们不必在每一个手动更改它.
问题是数据注释的正则表达式参数必须是常量,所以我不能在运行时(从我的第一个想法)中分配一个从配置文件或数据库中检索到的值.
任何人都可以帮助我一个聪明的解决方案,否则,这是一个替代方法,将有助于实现同样的目标?或者这只是要求我们写一个专门的定制验证属性,它将接受非常数值?
最简单的方法是编写一个继承自RegularExpressionAttribute的自定义ValidationAttribute,如下所示:
原文链接:https://www.f2er.com/regex/357122.htmlpublic 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})?$"; } }
这样,您仍然使用内置的正则表达式验证,但您可以自定义它.你只需简单地使用它:
[Email(ErrorMessage = "Please use a valid email address")]
最后,要让客户端验证工作,您只需在Global.asax中的Application_Start方法中添加以下内容即可告诉MVC对该验证器使用正常的正则表达式验证:
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute),typeof(RegularExpressionAttributeAdapter));