【问题标题】:ASP.NET MVC data annotations client side validation with inherited RegularExpressionAttribute使用继承的 RegularExpressionAttribute 进行 ASP.NET MVC 数据注释客户端验证
【发布时间】:2011-04-07 08:53:27
【问题描述】:

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

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

有什么想法可以让客户端验证正常工作吗?

代码示例

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

【问题讨论】:

标签: asp.net regex asp.net-mvc data-annotations client-side-validation


【解决方案1】:

正确答案的延伸

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-.]+$
    {

    }
}

【讨论】:

  • 出于某种原因,即使调用了静态构造函数,也不会生成客户端验证标记。所以我将注册添加到Application_Start(),在Global.asax
【解决方案2】:

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

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

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

【讨论】:

  • 如何从我定义属性的地方注册适配器。此实现需要知道属性。我不能将 DLL 传递给另一个开发人员并要求使用属性我还应该要求他将一些代码添加到他的 asax 文件中。有没有更多的耦合方式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
相关资源
最近更新 更多