ASP.NET MVC数据批注使用继承的RegularExpressionAttribute进行客户端验证

ASP.NET MVC数据批注使用继承的RegularExpressionAttribute进行客户端验证,asp.net,regex,asp.net-mvc,data-annotations,client-side-validation,Asp.net,Regex,Asp.net Mvc,Data Annotations,Client Side Validation,为了保持模型验证干净,我想实现自己的验证属性,如PhoneNumberAttribute和EmailAttribute。其中一些可以很好地实现为从RegularExpressionAttribute继承的简单类 然而,我注意到这样做会破坏这些属性的客户端验证。我假设有某种类型的绑定在某个地方失败 我能做些什么让客户端验证正常工作 代码示例: 公共密封类MailAddressAttribute:RegularExpressionAttribute { publicmailAddressAttrib

为了保持模型验证干净,我想实现自己的验证属性,如
PhoneNumberAttribute
EmailAttribute
。其中一些可以很好地实现为从
RegularExpressionAttribute
继承的简单类

然而,我注意到这样做会破坏这些属性的客户端验证。我假设有某种类型的绑定在某个地方失败

我能做些什么让客户端验证正常工作

代码示例

公共密封类MailAddressAttribute:RegularExpressionAttribute
{
publicmailAddressAttribute()
:base(@“^[A-Za-z0-9.\%+-]+@[A-Za-z0-9.-]+\[A-Za-z]{2,4}$”)
{
}
}

您需要为自定义属性注册客户端验证适配器。在这种情况下,您可以使用System.Web.Mvc中现有的RegularExpressionAttributeAdapter,因为它应该与标准的regex属性完全相同。然后在应用程序开始使用时注册它:

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

如果您编写了一个需要自定义客户端验证的属性,您可以通过继承来实现自己的适配器(另请参见)。

扩展正确答案

public class EmailAttribute : RegularExpressionAttribute
{
    static EmailAttribute()
    {
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter));
    }

    public EmailAttribute()
        : base(@"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$") //^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
    {

    }
}

但它是一个RegularExpressionAttribute,并且它有一个正则表达式,如果在模型中显式定义它,它就可以正常工作。这正是我要问的问题:如何从定义属性的位置注册适配器。这个实现需要知道属性。我不能将DLL传递给其他开发人员并要求使用属性,我还应该要求他向asax文件中添加一些代码。是否存在耦合更少的方法?出于某种原因,即使调用了静态构造函数,也没有生成客户端验证标记。因此,我在
Global.asax
中将注册添加到
Application\u Start()