サンプルソース 817.75 KB
1 2 →

はじめに

 前回の記事「jQueryでWeb Formsアプリケーションのフィルタリングユーザーインターフェースを作成する(前編)」では、ASP.NET Web FormsアプリケーションでjQueryを使って折りたたみ式のフィルタリングユーザーインターフェースを作成する方法を説明しました。ユーザーのブラウザにページがロードされるとき、フィルタリングインターフェースは折りたたまれた状態になっています。フィルタリングインターフェースのタイトルをクリックすると、インターフェースを折りたたみ状態と展開状態の間で切り替えることができます。展開状態では、DropDownList、TextBox、CheckBoxなどのフィルタリングコントロールを使用して、フィルタリングインターフェースの下のレポートに表示されている結果の絞り込みができます。

 前編で作成したフィルタリングインターフェースも動作することはしますが、インターフェースの折りたたみ/展開の状態を記憶しません。そのため、展開状態であっても、ポストバックの後や、ユーザーがいったんページを離れて再び戻ってきた場合には、フィルタリングインターフェースは折りたたみ状態に戻ってしまいます。幸い、ちょっとしたAJAXの機能を利用すれば、ユーザーセッションの間じゅう、フィルタリングユーザーインターフェースの折りたたみ/展開状態を記憶できます。本稿では、この機能を追加する方法を説明します。

 前編をまだ読んでいない読者は、後編にとりかかる前にぜひ前編をお読みください。

JavaScriptをプログラムで挿入する

 前編のサンプルでは、JavaScriptコードをASP.NETページのマークアップ部分に直接記述していました(Demo.aspx)。

<script type="text/javascript"> 
   $(document).ready(function() { 
      $('#filterUI').hide(); 

      $('#filterUItitle').click(function() { 
         $('#filterUI').slideToggle(400); 
         $('#filterUItitle').toggleClass('expandIcon'); 
         $('#filterUItitle').toggleClass('collapseIcon'); 
      }); 
   }); 
</script> 

 このスクリプトは、Webページがブラウザにロードされるたびに、それがページへの初めての訪問であるかポストバックであるかに関係なく実行されます。documentreadyイベントハンドラの最初の行($('#filterUI').hide())では、フィルタリングユーザーインターフェースを非表示にしています。そのため、ページのロード時にもポストバック後にもインターフェースが折りたたまれます。

 ページロード間でフィルタリングユーザーインターフェースの折りたたみ/展開状態を維持するには、次の2点を行う必要があります。

  1. 何らかの方法により、ユーザーごとの折りたたみ/展開状態を記憶する
  2. 上記1に基づいて、ページのロード時にフィルタリングユーザーインターフェースの表示/非表示を設定する

 1を実装する方法はひとまず置いておき、先に2に着目します。フィルタリングインターフェースの表示/非表示を設定するには、適切なJavaScriptをプログラムで挿入する必要があります。フィルタリングインターフェースを非表示にする(折りたたむ)ときは$('#filterUI').hide()、表示する(展開する)ときは$('#filterUI').show()を挿入しなければなりません。

 ASP.NETのClientScriptManagerクラスを使用すると、プログラムによってJavaScriptコードをページに挿入できます。このクラスにはPage.ClientScriptオブジェクトを介してアクセスでき、このクラスのRegisterClientScriptBlockメソッドやRegisterStartupScriptメソッドを使用して、適切なスクリプトを含むdocumentreadyイベントハンドラを挿入できます(本稿では、サーバーサイドのコードからクライアントサイドのスクリプトをASP.NETページに追加する際の問題については取り上げません。その詳細については、Xun Ding氏の記事「JavaScript With ASP.NET 2.0 Pages」を参照ください)。

 本稿のダウンロード可能なサンプルプロジェクトには、BasePageというカスタムのベースページクラスが含まれています。カスタムのベースページクラスを作成し、これをすべてのページの基本として使うようにすると、共通の機能をすべてのASP.NETページに反映させるときに便利です。ベースページクラスの使用方法と利点については、記事「Using a Custom Base Class for your ASP.NET Pages' Code-Behind Classes」を参照ください。

 本稿のサンプルのBasePageクラスには、jQUeryDocumentReadyStatementsという文字列リストのプロパティがあります。BasePageクラスでは、OnPreRenderメソッドもオーバーライドしています。このメソッドは、ページのライフサイクルにおいて、クライアントサイドのスクリプトをASP.NETページに追加するのに最もふさわしいタイミングです。オーバーライドしたメソッドでは、jQUeryDocumentReadyStatementsリストの中に文字列があるかどうかをチェックし、文字列がある場合は、指定されたステートメントを含むdocumentreadyイベントハンドラのスクリプトブロックを挿入します。オーバーライド後のOnPreRenderを次に示します。

Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs) 
   'Add jQuery document ready function, if needed 
   If jQueryDocumentReadyStatements.Count > 0 Then 
      Dim jQueryScript As String = "$(document).ready(function() {" 

      For Each stmt As String In jQueryDocumentReadyStatements 
         jQueryScript &= String.Concat(vbCrLf, stmt, vbCrLf) 
      Next 

      jQueryScript &= "});" 

      ClientScript.RegisterClientScriptBlock(Me.GetType, "jquery_DocumentReadyCode", jQueryScript, True) 
   End If 

   MyBase.OnPreRender(e) 
End Sub 

 サーバーサイドのコードからプログラムによってdocumentreadyイベントハンドラを作成するには、次の作業が必要です。

  1. System.Web.UI.Pageではなく)BasePageからASP.NETページを派生させる
  2. documentreadyイベントハンドラに入れるJavaScriptの各ステートメントを、次のようにjQUeryDocumentReadyStatementsコレクションに追加する
MyBase.jQueryDocumentReadyStatements.Add("$('#filterUI').hide();") 

 または、

MyBase.jQueryDocumentReadyStatements.Add("$('#filterUI').show();") 

 これにより、指定されたJavaScriptステートメントを含むdocument readyイベントハンドラがページに挿入されます。


1 2
→
INDEX
jQueryでWeb Formsアプリケーションのフィルタリングユーザーインターフェイスを作成する(後編)
Page1
はじめに
JavaScriptをプログラムで挿入する
フィルタリングユーザーインターフェースを折りたたむか展開するかを判断する
フィルタリングユーザーインターフェースの折りたたみ/展開時にセッション変数を切り替える
まとめ
参考資料
プロフィール
japan.internet.com ジャパンインターネットコム

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。


注目の求人情報
コンサルタント/高度な技術力が強みの戦略ファーム
・クライアントにインタビューを行いながら、対象業務を分析して、ビジネス上の課題と解決策を立案する...
プロジェクトマネージャー/イントラネット開発
お客様から要望を伺い、どのような情報システムが求められているのかを見極めながら提案し、受注後は開...
コンサルタント/少数精鋭のWeb戦略コンサルティングファーム
ユーザビリティーコンサルタント: 論理的な観点からサイトや製品のコンセプト設計~詳細な画面・製品...

(最新日付順)
名前(ゲストの方もコメントをどうぞ):*
アイコン:
なし

内容(テキストのみ1200文字まで):*

投稿規定に同意して

スポンサーサイト

この記事のトラックバックURL: