20

モデルの検証をクリーンに保つために、やなどの独自の検証属性を実装したいと思いPhoneNumberAttributeますEmailAttribute。これらのいくつかは、から継承する単純なクラスとして実装できますRegularExpressionAttribute

ただし、これを行うと、これらの属性のクライアント側の検証が失敗することに気付きました。どこかで失敗するタイプバインディングがあると思います。

クライアント側の検証を機能させるために私ができることはありますか?

コード例

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

2 に答える 2

29

カスタム属性のクライアント側検証アダプターを登録する必要があります。この場合、System.Web.Mvcの既存のRegularExpressionAttributeAdapterを使用できます。これは、標準のregex属性とまったく同じように機能する必要があるためです。次に、アプリケーションが使用を開始したときに登録します。

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

カスタムのクライアント側検証を必要とする属性を作成する場合は、DataAnnotationsModelValidatorから継承することで独自のアダプターを実装できます( Phil Haackのブログも参照)。

于 2010-09-03T08:53:33.517 に答える
9

正解の拡張

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

    }
}
于 2012-04-05T19:43:01.360 に答える