【ASP.NET コントロール】妥当性検証・Validation (CustomValidator編)

CustomValidator

 * 標準の検証コントロールでは対応できない独自の検証ロジックを実装するためのコントロール

主なプロパティ

 * EnableClientScript
  => trueの場合(デフォルトはtrue)、各検証コントロールはクライアント側で
     スクリプトを使ってチェックをし、サーバ上でもチェックを行う。
 * ClientValidationFunction
  => クライアント側の検証メソッドをClientValidationFunction属性で
     定義することができる
 * ValidateEmptyText
  => 空文字の時にも検証するかどうか

サンプル1:全角・半角混合用バイトチェック付TextBox

WebUserControl1.ascx

Public Class WebUserControl1
    Inherits System.Web.UI.UserControl

    Public Event ServerValidate(ByVal sender As Object, ByVal e As EventArgs)

    Public Property MaxLength() As Integer
        Set(value As Integer)
            Me.TextBox1.MaxLength = value
        End Set

        Get
            Return Me.TextBox1.MaxLength
        End Get
    End Property

    Public Property ValidationGroup() As String
        Set(value As String)
            Me.CustomValidator1.ValidationGroup = value
        End Set

        Get
            Return Me.CustomValidator1.ValidationGroup
        End Get
    End Property

    Protected Sub CustomValidator1_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
        Dim encoding As Encoding = encoding.GetEncoding("Shift_JIS")
        Dim byteNumber As Integer = encoding.GetByteCount(Me.TextBox1.Text)
        Dim isOver As Boolean = False
        If byteNumber > Me.TextBox1.MaxLength Then
            isOver = True
        End If

        args.IsValid = Not isOver
    End Sub
End Class

参考資料

http://www.atmarkit.co.jp/fdotnet/dotnettips/012strcount/strcount.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/013enumenc/enumenc.html

サンプル2:マスタ重複チェック

vb

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If Page.IsValid Then
        ' 検証に成功した場合の処理を記述
    End If
End Sub

Protected Sub CustomValidator1_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
    Dim exist As Boolean = Me.DummyExists()
    ' 検証結果は、ServerValidateEventArgsオブジェクトのIsValidプロパティにTrue/Falseでセットする
    args.IsValid = Not exist
End Sub

Private Function DummyExists() As Boolean
    ' 重複しているとダミーで返す
    Return True
End Function

デザイナ部

<asp:TextBox ID="TextBox1" runat="server" ValidationGroup="test"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server" 
    ErrorMessage="error" 
    ClientValidationFunction="CustomValidator1_ServerValidate" 
    ControlToValidate="TextBox1" EnableClientScript="False" ValidationGroup="test">*</asp:CustomValidator>
<br />
<asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="test" />

参考資料

http://www.atmarkit.co.jp/fdotnet/dotnettips/244aspcustvali/aspcustvali.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/279aspcustvali/aspcustvali.html

その他のValidation

RequiredFieldValidator/RangeValidator編

http://blogs.yahoo.co.jp/dk521123/25326361.html

RegularExpressionValidator編

http://blogs.yahoo.co.jp/dk521123/26142875.html

CustomValidator編

http://blogs.yahoo.co.jp/dk521123/26091356.html

あれこれ編

http://blogs.yahoo.co.jp/dk521123/26476406.html