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

标签 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; }


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

问题在于数据注释的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/

相关文章:

C# Regex 组多个捕获

regex - Perl 正则表达式 : non-capturing group seems not to be working

asp.net-mvc-3 - 将数据从 Action 传递到另一个 Action

ruby-on-rails - 如何在线显示验证错误而不是在页面顶部

Android - Surface 无效

python - 两个 python 列表之间的部分匹配,一个列表完全存在于另一个列表中,在 Python 中几乎没有附加字符

C# 正则表达式,用于将 [ 的出现更改为 [[] 并将 ] 的出现更改为 []]

asp.net-mvc - 有没有办法从 Controller A 调用的 Controller B 返回 ActionResult,同时向 B 提供特定模型?

jquery - session 超时时调用 Ajax

javascript - 使用 Angular ui路由器的多步表单