2010-09-02 97 views
19

为了保持我的模型验证清洁,我想实现我自己的验证属性,如PhoneNumberAttributeEmailAttribute。其中的一些可以有利地实现为从RegularExpressionAttribute继承的简单类。ASP.NET MVC数据注释客户端验证与继承RegularExpressionAttribute

但是,我注意到这样做会破坏这些属性的客户端验证。我假设有某种类型的绑定失败了。

任何想法我可以做些什么来获得客户端验证工作?

代码示例

public sealed class MailAddressAttribute : RegularExpressionAttribute 
{ 
    public MailAddressAttribute() 
     : base(@"^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}$") 
    { 
    } 
} 
+0

延伸,但它是一个RegularExpressionAttribute,它有一个正则表达式,如果它在模型中明确定义哪些工作就好了。 – zidar 2010-09-02 14:24:34

+0

正是我要问的 – TWith2Sugars 2010-09-28 08:51:36

回答

26

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

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

如果你写的需要定制的客户端验证属性,您可以通过从DataAnnotationsModelValidator继承实现自己的适配器(另见Phil Haack's blog)。

+1

正是我在找什么,谢谢。 – zidar 2010-09-03 08:56:16

+0

如何从我定义属性的地方注册适配器。这个实现需要知道属性。我无法将DLL传递给其他开发人员,并要求使用属性,我也应该让他将一些代码添加到他的asax文件中。有更少的耦合方式吗? – Cherven 2012-04-05 19:35:20

9

正确答案

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

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

    } 
} 
+0

由于某些原因,即使正在调用静态构造函数,这也不会生成客户端验证标记。所以我在'Global.asax'中将注册添加到'Application_Start()'中。 – 2017-12-15 15:21:32