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

あれこれ

コントロールをValidation対象外にするには...

対応策1

 * 対象外コントロールのプロパティ「CausesValidation : False」にする

# 例1であれば、再ゲーム用ボタンのプロパティ「CausesValidation : False」を指定すれば、検証対象外となる

対応策2

 * 対象コントロールおよびValidationコントロールのプロパティ「ValidationGroup : 【任意の文字列(例「Ans」など)】」を指定する

# 例1であれば、Button(回答用ボタン)/RequiredFieldValidator/RangeValidatorのプロパティ「ValidationGroup : "Ans"」を指定すれば、再ゲーム用ボタンは検証対象外となる

例1

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

日付などの型チェックにするには...

対応策1

 * CompareValidator コントロールを使用する。
  (1) Type プロパティを使用して、検証されるデータの種類を選択
  (2) Operator プロパティのDataTypeCheck 演算子を使用
http://msdn.microsoft.com/ja-jp/library/cc365283.aspx

日付のチェックの別解

対応策2

 * RangeValidator コントロールを使用する。
  (1) Type プロパティを使用して、検証されるデータの種類を選択(日付なら「Type="Date"」)
  (2) MinimumValue、MaximumValueを指定
http://d.hatena.ne.jp/fyts/20071018/validator

サンプル

<asp:TextBox ID="TextBox1" runat="server" ValidationGroup="date_error"></asp:TextBox>
<asp:RangeValidator ID="RangeValidator1" runat="server" 
    ControlToValidate="TextBox1" ErrorMessage="Date Error" 
    MaximumValue="9999/12/31" MinimumValue="1300/1/1" Type="Date" 
    ValidationGroup="date_error"></asp:RangeValidator>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

使用上の注意

 * 上記の「対応策2」の場合、『11/11/12』を入れた場合、『[m]m/dd/[yy]yy』と見なされ(下記URL参照のこと)、その結果『2012/11/11』となるため、エラーを通ってしまう。
http://msdn.microsoft.com/ja-jp/library/bb630352%28v=SQL.100%29.aspx

条件付きの検証を行うには...

http://www.atmarkit.co.jp/fdotnet/dotnettips/237aspcondvali/aspcondvali.html
だと、PostBackが発生する。CustomValidatorと動的に作成したJSで実装する。

サンプル(デザイン)

* TextBox1が何もないが、TextBox2には値が入っている場合、エラーを表示させる場合の実装。
<asp:TextBox ID="TextBox1" runat="server" ValidationGroup="sampleError"></asp:TextBox>
 -
<asp:TextBox ID="TextBox2" runat="server" ValidationGroup="sampleError"></asp:TextBox>
<asp:CustomValidator ID="CustomValidator1" runat="server" 
    ControlToValidate="TextBox2" ErrorMessage="CustomValidator" 
    ValidationGroup="sampleError"></asp:CustomValidator>
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button1" runat="server" Text="Button" 
    ValidationGroup="sampleError" />

サンプル(コードビハインド)

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim cs = Me.ClientScript

    Dim script As StringBuilder = New StringBuilder()
    script.AppendLine("<script language='javascript' type='text/javascript'>")
    script.AppendLine("function custom_Validate(sender, e) {")
    script.AppendLine("  var text1 = document.getElementById('TextBox1').value;")
    script.AppendLine("  var text2 = document.getElementById('TextBox2').value;")
    script.AppendLine("  if ((text1 == null || text1 == '') && (text2 != null || text2 != '')) {")
    script.AppendLine("    e.IsValid = false;")
    script.AppendLine("  } else {")
    script.AppendLine("    e.IsValid = true;")
    script.AppendLine("  }")
    script.AppendLine("}")
    script.AppendLine("</script>")

    cs.RegisterClientScriptBlock( _
        Me.GetType, "custom_Validate", script.ToString())

    Me.CustomValidator1.ClientValidationFunction = "custom_Validate"

End Sub

Protected Sub CustomValidator1_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
    If String.IsNullOrEmpty(TextBox1.Text) AndAlso _
        Not String.IsNullOrEmpty(TextBox2.Text) Then
        args.IsValid = False
    Else
        args.IsValid = True
    End If
End Sub

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Label1.Text = Me.TextBox1.Text & " ~ " & Me.TextBox2.Text
End Sub

Validation後に確認メッセージを表示するにはするには...

 * 以下のサイトのように、confirm()前に、Page_ClientValidate()を使ってValidationを行うようにする

if(!Page_ClientValidate('バリデーショングループ名')) return false; if(!confirm('登録しますか?')) return false;
http://oksys.blog15.fc2.com/blog-entry-17.html
 * 大規模な開発なら以下のサイトのようにカスタムでボタンを作成した方がいいかも。
http://d.hatena.ne.jp/hiro128/20101111/1289457028

その他の参考文献

http://d.hatena.ne.jp/manymanytips/20110117/1295243420

その他今後参考になりそうなサイト

http://mitc.xrea.jp/diary/070#p5.2

検証コントロールのパラメータを動的に設定するには?

http://www.atmarkit.co.jp/fdotnet/dotnettips/240aspdynavali/aspdynavali.html

JIT (Just-in-Time) 検証

http://msdn.microsoft.com/ja-jp/magazine/dd861289.aspx#id0080023

その他の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