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()
。