SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
jQuery Validation x ASP.NET MVC
で遭遇した不具合 & 対抗ハック

                      @jsakamoto




         Community Open Day
         2012
Twitter Hashtag

•   よろしければ、        #clrh71 でお願いいたします。
    –   #cod2012jp だけだと、全国会場の Tweet と混信しそうなので...

    –   本セッション中、MiniTwitter にて #clrh71 を含む Tweet をポップ
        アップします。
jQuery Validation についておさらい
•   クライアント側スクリプトによる入力検証機能を提供する JavaScript
    ライブラリ。
    –   jQuery のプラグイン

•   ASP.NET MVC の、標準のクライアント側入力検証エンジンに採用
    –   MVC3以降
    –   Visual Studio にて ASP.NET MVC アプリを新規作成すると標準で使用。

•   この資料を作成している時点での最新バージョン:
    –   jQuery = v.1.7.2
    –   jQuery Validation = v.1.9
本セッションのテーマ

•   jQuery Validation を使っている上で ”些細な” 不具合にいくつか遭遇

•   それら不具合について紹介、どう対策して解決したのかを披露

•   対策はすべて、クライアント側 JavaScript コード上で施工
    –   本セッションの本質的な部分では、C# とか ASP.NET とか出てきません。

    –   プラットフォーム問わず、Web アプリ共通の話題ではないでしょうか?

    –   っていうか、むしろ、Ruby on Rails などなど、他のプラットフォームでは
        問題になってないのか? 気になります。
デモ アプリ

•   こんな ASP.NET MVC4 な
    Webアプリを肴に、実演を
    交えつつ、進めて参ります。
Case 1.

  文字数検証 - input type=“text”
Demo
何が起きてる?

•   jQuery Validation は、行頭行末の空白を除いた文字数で
    チェック
    –   ”期待” とは異なったクライアント側検証。

•   サーバー側検証では、行頭行末の空白もそのままに文字
    数チェックするのでセーフ。
    –   ”Post Back” な挙動。

    –   Webではクライアント側検証に頼らないという鉄則。
対応
•   jQuery Validation の検証メソッドを改変すればいい




maxlength: function(value, element, param) {
 return this.optional(element) ||
 this.getLength($.trim(value), element) <= param;
}

                      この trim 要らない!
方法1 - jQuery Validation のソースを直接変更

•   MIT License

•   でも将来の jQuery Validation 本家のバージョンアップに
    ついていける?
方法2 – 開発元にフィードバック

•   trim しているのは、それはそれで意味があるのでしょう。

•   その上でなお、破壊的変更が受け入れられるのか?

•   仮に受け入れられるとして、リリースされるまで待てる?
    – “今そこにある危機”
方法3 – 実行時にOverride
•   JavaScript なので、実行時に「書き換え」できます。



    $.validator.methods.maxlength =
      function (value, element, param) {
        return this.optional(element) ||
          this.getLength(value, element) >= param;
      };
JavaScript コードの Hack
•   いかにも “動的言語” らしく、Hack しやすい。
•   しかし Closure が使える...!
    –   関数型言語っぽい手法で作成されると手が出せない。
•   jQuery Validation はそんな実装されてなく良かった...

                      これで学びました。
Case 2.

  文字数検証 - textarea
Demo
何が起きてる?

•   jQuery Validation は、改行は1文字として文字数チェック。
•   サーバー側検証では、改行は2文字として文字数チェック。
    –   POST データ中、改行が CR+LF になってる
    –   Windows7上で、IE9 でも Firefox12 でも Chrome19 でも同じ挙動
              ※以上を Fiddler v.2.3.9.3 で確認。MacOSではどうなんでしょう?

•   クライアント側とサーバー側とで検証動作が異なる。
    –   ちなみに、XHR要求だと改行が LF で送信されたり。
対応

•   サーバー側で CR+LF を LF に置換することで対応可能。

•   でも、漏れなく実装するのは大変では?

•   それでは jQuery Validation の実装を変更しましょう。
    –   オリジナルの $.validator.prototype.getLength(value, element ) が
        呼び出される前に、value に含まれる改行文字(LF)を2文字に置換し
        てオリジナル実装に渡すよう、カスタムコードを ”差し込む”。
実行時に Override
         元の実装をorgに確保

var org = $.validator.prototype.getLength;
                                       getLength メソッドを
                                        独自実装に差し替え
$.validator.prototype.getLength =
  function (value, element) {               LFを適当な
       value = value.replace(/¥n/g, "++"); 2文字に置換
       return org.apply(this, [value, element]);
    };
                       元の実装をapplyで実行
Case 3.

  Cancel ボタン
Demo
何が起きてる?
•   “cancel” CSSクラスを持つ input か button がクリックさ
    れると「入力検証しない」のフラグが立つ。
•   そしてそのフラグは解除されない。


     this
       .find("input,button")
       .filter(".cancel")
       .click(function() {
          validator.cancelSubmit = true;
       });
正攻法 – input で Cancel ボタンを実装しない
•   a 要素で。
•   Twitter Bootstrap など昨今の CSS ライブラリを使えば、a も
    input も、同じ外観に作れる。
どうしても、という場合...
•   「検証しない」フラグをワンショット遅延でオフに復元。


    $(".cancel").click(function () {

      var validator =
        $(this).closest("form").validate();

      setTimeout(function () {
          validator.cancelSubmit = false;
        }, 0);
    });
Case 4.

  IE8
Demo
何が起きてる?

•   $.validator.elements メソッドの内部に原因

•   IE8 だとなぜか、$($(“form”)[0].elements).filter(“:input”)
    の結果が、要素数 = 0個になっている
    – IE9   でも、ドキュメントモードが IE8 かそれ以前だと再現
対応 – jQuery Validation を最新に

•   この問題を抱えているのは、実は ver.1.8.0.1 まで。

•   jQuery Validation を ver.1.8.1 以降に Upgrade で解決。
    –   ver.1.8.1 のパッケージは 2011年6月10日頃から出現している模様。

    –   それ以前に作成されたASP.NET MVC3 アプリは注意?
jQuery Validation を最新にできない場合は...
•   $.validator.elements の実装を実行時に Override。
•   .filter(“:input”) ではなく、.find(“input, select, textarea”)
    で要素を絞り込む。

$.validator.prototype.elements = function () {
  ...
  return $([])
    .add(this.currentForm.elements)
    .find("input, select, textarea")
    ...;
};
Case 5.

  CSS Class 名が検証ルール名にかぶった
Demo
何が起きてる?

•   ASP.NET としての入力検証機構とは無関係に、jQuery
    Validation による入力検証機構は活きている

•   そのひとつ、CSSクラス名による入力検証の発動
    –   email
    –   required
    –   date
    –   number
    –   ...
jQuery Validation 標準の検証ルールは潰せる

•   $.validator.classRuleSettings からCSSクラス名ルールを削除



     delete $.validator.classRuleSettings.email;
徒然に
些細なことにこだわってばかりで、
自分が器の小さい人間に思えてきました...


だって、結局は、サーバー側検証が機能するんだし...
結局、フィードバックは、Microsoft を含め、
どこにもしていません。


他の仕事とか優先してしまい...
どなたか Microsoft Connect とかに投稿いただません?
Web Forms や、MVC2 までの
クライアント側入力検証では、些細とはいえ、
こんな問題はなかったよな... と思ったり。


さすが Microsoft 純正品クォリティ?

今振り返るに、jQuery Validation の採用はどうだったんだろう...
Thank you...

Weitere ähnliche Inhalte

Was ist angesagt?

技術コミュニティリーダーMicrosoft MVPの活躍に学ぶ コミュニティ活動のススメ
技術コミュニティリーダーMicrosoft MVPの活躍に学ぶ コミュニティ活動のススメ技術コミュニティリーダーMicrosoft MVPの活躍に学ぶ コミュニティ活動のススメ
技術コミュニティリーダーMicrosoft MVPの活躍に学ぶ コミュニティ活動のススメRie Moriguchi
 
GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境Yasutomo Uemori
 
バックログとタスクをインポート・エクスポート Team Foundation Server と Excel・Project との連携
バックログとタスクをインポート・エクスポート Team Foundation Server と Excel・Project との連携バックログとタスクをインポート・エクスポート Team Foundation Server と Excel・Project との連携
バックログとタスクをインポート・エクスポート Team Foundation Server と Excel・Project との連携慎一 古賀
 
CMDBuildを中心とした運用管理自動化基盤OpenPIEの事例紹介
CMDBuildを中心とした運用管理自動化基盤OpenPIEの事例紹介CMDBuildを中心とした運用管理自動化基盤OpenPIEの事例紹介
CMDBuildを中心とした運用管理自動化基盤OpenPIEの事例紹介OSSラボ株式会社
 
AbemaTVのアーキテクチャの変遷 / AbemaTV DevCon 2018 TrackA Session A2
AbemaTVのアーキテクチャの変遷 / AbemaTV DevCon 2018 TrackA Session A2AbemaTVのアーキテクチャの変遷 / AbemaTV DevCon 2018 TrackA Session A2
AbemaTVのアーキテクチャの変遷 / AbemaTV DevCon 2018 TrackA Session A2AbemaTV, Inc.
 
JSON, JSON Schema, and OpenAPI
JSON, JSON Schema, and OpenAPIJSON, JSON Schema, and OpenAPI
JSON, JSON Schema, and OpenAPIOctavian Nadolu
 
Jaspersoft Studioチュートリアル1 - レポートの作成
Jaspersoft Studioチュートリアル1 - レポートの作成Jaspersoft Studioチュートリアル1 - レポートの作成
Jaspersoft Studioチュートリアル1 - レポートの作成htshozawa
 
趣味と仕事の違い、現場で求められるアプリケーションの可観測性
趣味と仕事の違い、現場で求められるアプリケーションの可観測性趣味と仕事の違い、現場で求められるアプリケーションの可観測性
趣味と仕事の違い、現場で求められるアプリケーションの可観測性LIFULL Co., Ltd.
 
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話Katsuya Yamaguchi
 
Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界Hideki Takase
 
データ収集の基本と「JapanTaxi」アプリにおける実践例
データ収集の基本と「JapanTaxi」アプリにおける実践例データ収集の基本と「JapanTaxi」アプリにおける実践例
データ収集の基本と「JapanTaxi」アプリにおける実践例Tetsutaro Watanabe
 
虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴 開発室
 
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来Shinya Mori (@mosuke5)
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践Yoshifumi Kawai
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門Tadahiro Ishisaka
 

Was ist angesagt? (20)

技術コミュニティリーダーMicrosoft MVPの活躍に学ぶ コミュニティ活動のススメ
技術コミュニティリーダーMicrosoft MVPの活躍に学ぶ コミュニティ活動のススメ技術コミュニティリーダーMicrosoft MVPの活躍に学ぶ コミュニティ活動のススメ
技術コミュニティリーダーMicrosoft MVPの活躍に学ぶ コミュニティ活動のススメ
 
GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境GCP・GKEで作るスケーラブルなゲーム開発環境
GCP・GKEで作るスケーラブルなゲーム開発環境
 
バックログとタスクをインポート・エクスポート Team Foundation Server と Excel・Project との連携
バックログとタスクをインポート・エクスポート Team Foundation Server と Excel・Project との連携バックログとタスクをインポート・エクスポート Team Foundation Server と Excel・Project との連携
バックログとタスクをインポート・エクスポート Team Foundation Server と Excel・Project との連携
 
DLL読み込みの問題を読み解く
DLL読み込みの問題を読み解くDLL読み込みの問題を読み解く
DLL読み込みの問題を読み解く
 
CMDBuildを中心とした運用管理自動化基盤OpenPIEの事例紹介
CMDBuildを中心とした運用管理自動化基盤OpenPIEの事例紹介CMDBuildを中心とした運用管理自動化基盤OpenPIEの事例紹介
CMDBuildを中心とした運用管理自動化基盤OpenPIEの事例紹介
 
AbemaTVのアーキテクチャの変遷 / AbemaTV DevCon 2018 TrackA Session A2
AbemaTVのアーキテクチャの変遷 / AbemaTV DevCon 2018 TrackA Session A2AbemaTVのアーキテクチャの変遷 / AbemaTV DevCon 2018 TrackA Session A2
AbemaTVのアーキテクチャの変遷 / AbemaTV DevCon 2018 TrackA Session A2
 
JSON, JSON Schema, and OpenAPI
JSON, JSON Schema, and OpenAPIJSON, JSON Schema, and OpenAPI
JSON, JSON Schema, and OpenAPI
 
Edge AI ソリューションを支える Azure IoT サービス
Edge AI ソリューションを支える Azure IoT サービスEdge AI ソリューションを支える Azure IoT サービス
Edge AI ソリューションを支える Azure IoT サービス
 
Jaspersoft Studioチュートリアル1 - レポートの作成
Jaspersoft Studioチュートリアル1 - レポートの作成Jaspersoft Studioチュートリアル1 - レポートの作成
Jaspersoft Studioチュートリアル1 - レポートの作成
 
Socket.io (part 1)
Socket.io (part 1)Socket.io (part 1)
Socket.io (part 1)
 
趣味と仕事の違い、現場で求められるアプリケーションの可観測性
趣味と仕事の違い、現場で求められるアプリケーションの可観測性趣味と仕事の違い、現場で求められるアプリケーションの可観測性
趣味と仕事の違い、現場で求められるアプリケーションの可観測性
 
[BurpSuiteJapan]Burp Suite実践編
[BurpSuiteJapan]Burp Suite実践編[BurpSuiteJapan]Burp Suite実践編
[BurpSuiteJapan]Burp Suite実践編
 
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
CSI Driverを開発し自社プライベートクラウドにより適した安全なKubernetes Secrets管理を実現した話
 
Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界
 
データ収集の基本と「JapanTaxi」アプリにおける実践例
データ収集の基本と「JapanTaxi」アプリにおける実践例データ収集の基本と「JapanTaxi」アプリにおける実践例
データ収集の基本と「JapanTaxi」アプリにおける実践例
 
虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf虎の穴ラボ エンジニア採用説明資料 .pdf
虎の穴ラボ エンジニア採用説明資料 .pdf
 
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
【解説】データ指向アプリケーションデザイン 12章 データシステムの未来
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
 

Ähnlich wie jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック

Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術finoue
 
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidationTakayoshi Tanaka
 
ビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストTsutomu Chikuba
 
20120507 zendform
20120507 zendform20120507 zendform
20120507 zendformYusuke Ando
 
JenkinsとSeleniumの活用事例
JenkinsとSeleniumの活用事例JenkinsとSeleniumの活用事例
JenkinsとSeleniumの活用事例Takeshi Kondo
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~normalian
 
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会yoshinori matsumoto
 
やってみよう!ASP.NET MVC #2
やってみよう!ASP.NET MVC #2やってみよう!ASP.NET MVC #2
やってみよう!ASP.NET MVC #2Tadahiro Higuchi
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所真吾 吉田
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回Naoyuki Yamada
 
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発lalha
 
Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案
Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案
Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案Kazunori Sakamoto
 

Ähnlich wie jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック (20)

Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術Awsで実現するseleniumテスト高速術
Awsで実現するseleniumテスト高速術
 
111008 silverlight square_datavalidation
111008 silverlight square_datavalidation111008 silverlight square_datavalidation
111008 silverlight square_datavalidation
 
CruiseControl.NET設置
CruiseControl.NET設置CruiseControl.NET設置
CruiseControl.NET設置
 
ビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテスト
 
20120507 zendform
20120507 zendform20120507 zendform
20120507 zendform
 
JenkinsとSeleniumの活用事例
JenkinsとSeleniumの活用事例JenkinsとSeleniumの活用事例
JenkinsとSeleniumの活用事例
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
 
Selenium
SeleniumSelenium
Selenium
 
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
やってみよう!ASP.NET MVC #2
やってみよう!ASP.NET MVC #2やってみよう!ASP.NET MVC #2
やってみよう!ASP.NET MVC #2
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
継続的8章
継続的8章継続的8章
継続的8章
 
20080524
2008052420080524
20080524
 
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回
 
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
 
Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案
Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案
Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案
 

Mehr von Jun-ichi Sakamoto

C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へC# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へJun-ichi Sakamoto
 
Pre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing timePre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing timeJun-ichi Sakamoto
 
WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来Jun-ichi Sakamoto
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LTAzure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LTJun-ichi Sakamoto
 
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点Jun-ichi Sakamoto
 
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
C# で Single Page Web アプリを開発できる Blazor ― その魅力C# で Single Page Web アプリを開発できる Blazor ― その魅力
C# で Single Page Web アプリを 開発できる Blazor ― その魅力Jun-ichi Sakamoto
 
Azure App Service Authentication
Azure App Service AuthenticationAzure App Service Authentication
Azure App Service AuthenticationJun-ichi Sakamoto
 
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」Jun-ichi Sakamoto
 
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編Jun-ichi Sakamoto
 
Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編Jun-ichi Sakamoto
 
CLR/H 第99回勉強会ライトニングトーク
CLR/H 第99回勉強会ライトニングトークCLR/H 第99回勉強会ライトニングトーク
CLR/H 第99回勉強会ライトニングトークJun-ichi Sakamoto
 
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―Jun-ichi Sakamoto
 
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!Jun-ichi Sakamoto
 
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみたJun-ichi Sakamoto
 
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトークMore Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトークJun-ichi Sakamoto
 
One horror stories around NuGet
One horror stories around NuGetOne horror stories around NuGet
One horror stories around NuGetJun-ichi Sakamoto
 
How to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail featureHow to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail featureJun-ichi Sakamoto
 
Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"Jun-ichi Sakamoto
 
セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!Jun-ichi Sakamoto
 

Mehr von Jun-ichi Sakamoto (20)

C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へC# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
C# で SPA を作る BLAZOR WEBASSEMBLY の進化 - そしてその先へ
 
Pre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing timePre-render Blazor WebAssembly on static web hosting at publishing time
Pre-render Blazor WebAssembly on static web hosting at publishing time
 
WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来WebAssemblyが切り拓くフロントエンドWeb開発の未来
WebAssemblyが切り拓くフロントエンドWeb開発の未来
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LTAzure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
Azure Application Insights + Angular5+ - Global azure boot camp 2019@sapporo LT
 
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
C# で Single Page Web アプリが開発できるフレームワーク&開発環境 「Blazor」 ― その概要と Web アプリ開発者にもたらす利点
 
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
C# で Single Page Web アプリを開発できる Blazor ― その魅力C# で Single Page Web アプリを開発できる Blazor ― その魅力
C# で Single Page Web アプリを 開発できる Blazor ― その魅力
 
Azure App Service Authentication
Azure App Service AuthenticationAzure App Service Authentication
Azure App Service Authentication
 
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
ライトニングトーク - とある LINE Bot の開発記「とても腹立たしいことがあったのです」
 
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
「ゆるくLTをしよう勉強会@旭川」jsakamoto 予告編
 
Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編Ohotech特盛#14 セッション4 予告編
Ohotech特盛#14 セッション4 予告編
 
CLR/H 第99回勉強会ライトニングトーク
CLR/H 第99回勉強会ライトニングトークCLR/H 第99回勉強会ライトニングトーク
CLR/H 第99回勉強会ライトニングトーク
 
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―Ohotech特盛#13 スマホで操作するカメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
Ohotech特盛#13 スマホで操作する カメラ付きWi-Fiラジコンカー ― C#とラズパイとWebアプリの技術で作っちゃおう! ―
 
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
 
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
息子たちがローマ字勉強するための &lt;s>HTML5&lt;/s> Web標準 アプリ作ってみた
 
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトークMore Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
More Azure Websites! - JAZUGさっぽろ "きたあず" 第5回勉強会ライトニングトーク
 
One horror stories around NuGet
One horror stories around NuGetOne horror stories around NuGet
One horror stories around NuGet
 
How to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail featureHow to automated test a web application with sending e mail feature
How to automated test a web application with sending e mail feature
 
Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"Introduction of "MarkdownPresenter"
Introduction of "MarkdownPresenter"
 
セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!セッション中に Twitter につぶやく!
セッション中に Twitter につぶやく!
 

Kürzlich hochgeladen

20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 

Kürzlich hochgeladen (9)

20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 

jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック

  • 1. jQuery Validation x ASP.NET MVC で遭遇した不具合 & 対抗ハック @jsakamoto Community Open Day 2012
  • 2. Twitter Hashtag • よろしければ、 #clrh71 でお願いいたします。 – #cod2012jp だけだと、全国会場の Tweet と混信しそうなので... – 本セッション中、MiniTwitter にて #clrh71 を含む Tweet をポップ アップします。
  • 3. jQuery Validation についておさらい • クライアント側スクリプトによる入力検証機能を提供する JavaScript ライブラリ。 – jQuery のプラグイン • ASP.NET MVC の、標準のクライアント側入力検証エンジンに採用 – MVC3以降 – Visual Studio にて ASP.NET MVC アプリを新規作成すると標準で使用。 • この資料を作成している時点での最新バージョン: – jQuery = v.1.7.2 – jQuery Validation = v.1.9
  • 4. 本セッションのテーマ • jQuery Validation を使っている上で ”些細な” 不具合にいくつか遭遇 • それら不具合について紹介、どう対策して解決したのかを披露 • 対策はすべて、クライアント側 JavaScript コード上で施工 – 本セッションの本質的な部分では、C# とか ASP.NET とか出てきません。 – プラットフォーム問わず、Web アプリ共通の話題ではないでしょうか? – っていうか、むしろ、Ruby on Rails などなど、他のプラットフォームでは 問題になってないのか? 気になります。
  • 5. デモ アプリ • こんな ASP.NET MVC4 な Webアプリを肴に、実演を 交えつつ、進めて参ります。
  • 6. Case 1. 文字数検証 - input type=“text”
  • 8. 何が起きてる? • jQuery Validation は、行頭行末の空白を除いた文字数で チェック – ”期待” とは異なったクライアント側検証。 • サーバー側検証では、行頭行末の空白もそのままに文字 数チェックするのでセーフ。 – ”Post Back” な挙動。 – Webではクライアント側検証に頼らないという鉄則。
  • 9. 対応 • jQuery Validation の検証メソッドを改変すればいい maxlength: function(value, element, param) { return this.optional(element) || this.getLength($.trim(value), element) <= param; } この trim 要らない!
  • 10. 方法1 - jQuery Validation のソースを直接変更 • MIT License • でも将来の jQuery Validation 本家のバージョンアップに ついていける?
  • 11. 方法2 – 開発元にフィードバック • trim しているのは、それはそれで意味があるのでしょう。 • その上でなお、破壊的変更が受け入れられるのか? • 仮に受け入れられるとして、リリースされるまで待てる? – “今そこにある危機”
  • 12. 方法3 – 実行時にOverride • JavaScript なので、実行時に「書き換え」できます。 $.validator.methods.maxlength = function (value, element, param) { return this.optional(element) || this.getLength(value, element) >= param; };
  • 13. JavaScript コードの Hack • いかにも “動的言語” らしく、Hack しやすい。 • しかし Closure が使える...! – 関数型言語っぽい手法で作成されると手が出せない。 • jQuery Validation はそんな実装されてなく良かった... これで学びました。
  • 14. Case 2. 文字数検証 - textarea
  • 15. Demo
  • 16. 何が起きてる? • jQuery Validation は、改行は1文字として文字数チェック。 • サーバー側検証では、改行は2文字として文字数チェック。 – POST データ中、改行が CR+LF になってる – Windows7上で、IE9 でも Firefox12 でも Chrome19 でも同じ挙動 ※以上を Fiddler v.2.3.9.3 で確認。MacOSではどうなんでしょう? • クライアント側とサーバー側とで検証動作が異なる。 – ちなみに、XHR要求だと改行が LF で送信されたり。
  • 17. 対応 • サーバー側で CR+LF を LF に置換することで対応可能。 • でも、漏れなく実装するのは大変では? • それでは jQuery Validation の実装を変更しましょう。 – オリジナルの $.validator.prototype.getLength(value, element ) が 呼び出される前に、value に含まれる改行文字(LF)を2文字に置換し てオリジナル実装に渡すよう、カスタムコードを ”差し込む”。
  • 18. 実行時に Override 元の実装をorgに確保 var org = $.validator.prototype.getLength; getLength メソッドを 独自実装に差し替え $.validator.prototype.getLength = function (value, element) { LFを適当な value = value.replace(/¥n/g, "++"); 2文字に置換 return org.apply(this, [value, element]); }; 元の実装をapplyで実行
  • 19. Case 3. Cancel ボタン
  • 20. Demo
  • 21. 何が起きてる? • “cancel” CSSクラスを持つ input か button がクリックさ れると「入力検証しない」のフラグが立つ。 • そしてそのフラグは解除されない。 this .find("input,button") .filter(".cancel") .click(function() { validator.cancelSubmit = true; });
  • 22. 正攻法 – input で Cancel ボタンを実装しない • a 要素で。 • Twitter Bootstrap など昨今の CSS ライブラリを使えば、a も input も、同じ外観に作れる。
  • 23. どうしても、という場合... • 「検証しない」フラグをワンショット遅延でオフに復元。 $(".cancel").click(function () { var validator = $(this).closest("form").validate(); setTimeout(function () { validator.cancelSubmit = false; }, 0); });
  • 24. Case 4. IE8
  • 25. Demo
  • 26. 何が起きてる? • $.validator.elements メソッドの内部に原因 • IE8 だとなぜか、$($(“form”)[0].elements).filter(“:input”) の結果が、要素数 = 0個になっている – IE9 でも、ドキュメントモードが IE8 かそれ以前だと再現
  • 27. 対応 – jQuery Validation を最新に • この問題を抱えているのは、実は ver.1.8.0.1 まで。 • jQuery Validation を ver.1.8.1 以降に Upgrade で解決。 – ver.1.8.1 のパッケージは 2011年6月10日頃から出現している模様。 – それ以前に作成されたASP.NET MVC3 アプリは注意?
  • 28. jQuery Validation を最新にできない場合は... • $.validator.elements の実装を実行時に Override。 • .filter(“:input”) ではなく、.find(“input, select, textarea”) で要素を絞り込む。 $.validator.prototype.elements = function () { ... return $([]) .add(this.currentForm.elements) .find("input, select, textarea") ...; };
  • 29. Case 5. CSS Class 名が検証ルール名にかぶった
  • 30. Demo
  • 31. 何が起きてる? • ASP.NET としての入力検証機構とは無関係に、jQuery Validation による入力検証機構は活きている • そのひとつ、CSSクラス名による入力検証の発動 – email – required – date – number – ...
  • 32. jQuery Validation 標準の検証ルールは潰せる • $.validator.classRuleSettings からCSSクラス名ルールを削除 delete $.validator.classRuleSettings.email;
  • 36. Web Forms や、MVC2 までの クライアント側入力検証では、些細とはいえ、 こんな問題はなかったよな... と思ったり。 さすが Microsoft 純正品クォリティ? 今振り返るに、jQuery Validation の採用はどうだったんだろう...