jQuery UI のダイアログで jQuery Validation を使う方法

ASP.NET
By: Edwart Visser

リアルタイムフォームバリデーションが行えるjQuery Validationを使ってみました。
発生した問題を中心に最後にはASP.NETで工夫した全ソースコード公開です。

 

jQuery Validationはformへ

ダイアログをdivタグで構成していて、divタグに対して「$(‘#dialog’).validate()」のようにvalidateを指定しても動いてくれません。下記のエラーにさんざん悩まされました。validateはformタグへ行う必要があります。

Uncaught TypeError: Cannot call method 'element' of undefined | jquery.validate.js:106

 

ダイアログ内をformタグで囲みます。

<div id="dialog">
  <form id="form">
    <input type="text" name="field" />
  </form>
</div>

 

formタグにvalidateを設定します。

$('#form').validate({
  rules: {
    field: {
      // 必須
      required: true,
      // 数値のみ
      digits: true,
      // 最大文字数
      maxlength: 9,
      // 最小値
      min: 1
    }
  }
});

 

validメソッドでチェックすることができます。
問題がなければtrueが返ります。

var valid = $('#form').valid();

 

jQuery Validationのデモ

Openボタンからダイアログを開いて、Sendボタンで動作を確認できます。

[CodePen height=300 show=result href=BAdIq user=iw3 ]

 

ASP.NET WebフォームでのjQuery Validation

ASP.NETはASPXファイル内にformは1つだけという制約があって、ダイアログ内にformタグを記述しても消えてしまいます。そこでダイアログ内にformは記述せず、jQueryのwrapInner関数を使って動的に囲うことにしました。

こうすることでASP.NETでも複数のダイアログにvalidationを設定できます。

 

ASPXでjQuery Validationを使ったソースコード

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JQueryUIDialog.aspx.cs" Inherits="propeller.JQueryUIDialog" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link rel="stylesheet" href="//ajax.aspnetcdn.com/ajax/jquery.ui/1.10.3/themes/redmond/jquery-ui.css" media="all">
    <style>
        .error 
        {
            color: Red;
        }
    </style>
    <script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.1.min.js"></script>
    <script src="//ajax.aspnetcdn.com/ajax/jquery.ui/1.10.3/jquery-ui.min.js"></script>
    <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
    <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/localization/messages_ja.js "></script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <input id="open1" type="button" value="ダイアログ1" />
    <input id="open2" type="button" value="ダイアログ2" />
    <div id="dialog1" title="ダイアログ1">
        <input type="text" name="field" />
    </div>
    <div id="dialog2" title="ダイアログ2">
        <input type="text" name="field" />
    </div>
    </div>
    </form>
    <script>
        function createValidateOption() {
            return {
                rules: {
                    field: {
                        // 必須
                        required: true,
                        // 数値のみ
                        digits: true,
                        // 最大文字数
                        maxlength: 9,
                        // 最小値
                        min: 1
                    }
                }
            };
        }
        $(function () {
            // ------------------------------
            // ダイアログ1
            // ------------------------------
            $('#dialog1').wrapInner('<form></form>');
            var validator1 = $('#dialog1 form').validate(createValidateOption());
            $('#dialog1').dialog({
                autoOpen: false,
                buttons: {
                    'Send': function () {
                        if ($('#dialog1 form').valid()) {
                            alert('Success');
                            $('#dialog1').dialog('close');
                        }
                    }
                }
            });
            $('#open1').on('click', function () {
                validator1.resetForm();
                validator1.reset();
                $('#dialog1').dialog('open');
            });
            // ------------------------------
            // ダイアログ2
            // ------------------------------
            $('#dialog2').dialog({
                autoOpen: false,
                buttons: {
                    'Send': function () {
                        if ($('#dialog2 form').valid()) {
                            alert('Success');
                            $('#dialog2').dialog('close');
                        }
                    }
                }
            });
            $('#open2').on('click', function () {
                $('#dialog2').dialog('open');
            });
            $('#dialog2').wrapInner('<form></form>');
            $('#dialog2 form').validate(createValidateOption());
        });
    </script>
</body>
</html>

 

利用したCDN

http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.1.min.js
http://ajax.aspnetcdn.com/ajax/jquery.ui/1.10.3/jquery-ui.min.js
http://ajax.aspnetcdn.com/ajax/jquery.ui/1.10.3/themes/redmond/jquery-ui.css
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.js
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/localization/messages_ja.js

※ 最新のURLは Microsoft Ajax Content Delivery Network で確認できます。

 

参考情報

Dialog - jQuery UI API 1.8.4 日本語リファレンス - StackTrace
jQuery Validation Plugin | Form validation with jQuery
jquery-validation/jquery-validation
jQuery Validation Plugin library sources. Contribute to jquery-validation/jquery-validation development by creating an account on GitHub.

 

コメント

タイトルとURLをコピーしました