ASP.NET MVC ではクライアントサイド検証という機能があります。こいつを独自の検証属性で使うためには IClientValidatable インターフェースを検証属性に実装して、さらに JavaScript で実際に検証するコードを書く必要がありました。
しかし、前回の ASP.NET 4.5 で追加された検証属性 - しばやん雑記 で紹介した ASP.NET MVC から BCL に移った検証属性には、IClientValidatable インターフェースは実装されていません。ということですが、新しい検証属性ではクライアントサイド検証が使えないのかというと、そういうわけではありませんでした。
以下の表は実際に動作するかを確認した結果となります。
検証属性名 | クライアントサイド検証の動作可否 |
---|---|
CompareAttribute | 動作 |
CreditCardAttribute | 動作 |
EmailAddressAttribute | 動作 |
FileExtensionsAttribute | 仕組み上不可 |
MaxLengthAttribute | 動作せず |
MinLengthAttribute | 動作せず |
PhoneAttribute | 動作せず |
UrlAttribute | 動作 |
まとめ
FileExtensions 属性はマルチパートでアップロードされたものに対して検証を行うので、そもそもクライアントサイド検証が動作しません。これは想定の範囲内ですが、何故か正規表現でチェックしているだけの Phone 属性はクライアントサイド検証が動作しません。バグかも知れないです。
そして MaxLength 属性と MinLength 属性は配列に対しても動作するので、クライアントサイド検証を行わないようにしているのかもしれないです。文字列に対しての長さチェックで、クライアントサイド検証を使いたい場合には StringLength 属性を使いましょう。
ちなみに Compare 属性は System.ComponentModel.DataAnnotations 名前空間だけではなく、System.Web.Mvc 名前空間にも存在していますが、新しく追加されたものでもクライアントサイド検証が動作するので、これからは System.Web.Mvc 名前空間のものは使わないほうが良いかもしれないですね。