SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

2つのAJAX:「jQuery AJAX API」と「ASP.NET AJAX」

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント 第8回

[2]非同期リクエストおよびコールバック処理の作成

 Webページ側にjQuery AJAX APIを用いた非同期リクエストとコールバック処理の作成を行います。

1. 場所、会議室のClientIDModeをStaticにする

 jQueryで操作する項目については、前回にも説明した通り、ClientIDModeをStaticに設定しておきます。

リスト2 ClientIDMode設定(ReservationsDetail.aspxより)
<!-- 場所 -->
<asp:DropDownList ID="LocationDropDownList" runat="server"
  AppendDataBoundItems="True" DataTextField="LocationName"
  DataValueField="LocationId" DataSourceID="LocationObjectDataSource"
  ViewStateMode="Enabled" ClientIDMode="Static"
  OnDataBound="LocationDropDownList_DataBound"
  OnInit="LocationDropDownList_Init">
  <asp:ListItem Value="" Text="" />
</asp:DropDownList>

<!-- 会議室 -->
<asp:DropDownList ID="MeetingRoomDropDownList" runat="server"
  DataTextField="MeetingRoomName" DataValueField="MeetingRoomId"
  DataSourceID="MeetingRoomObjectDataSource" ViewStateMode="Enabled"
  ClientIDMode="Static" OnDataBound="MeetingRoomDropDownList_DataBound"
  OnInit="MeetingRoomDropDownList_Init">
</asp:DropDownList>
2. 場所変更時の会議室絞り込み処理を実装する

 場所を変更した際、会議室の絞り込み処理を行うよう、jQueryを使って実装します。

リスト3 場所による会議室絞込み処理(ReservationsDetail.aspxより)
$(document).ready(function () {
  // 場所の変更による会議室絞り込み処理
  var location = $("#LocationDropDownList");
  location.change(function () { // (1)
    $.ajax({  // (2)
      url: "MeetingRoomsHandler.ashx",
      type: "GET",
      data: { locationId: location.val() },
      dataType: "json",
      success: function (result) {	// (3)
        // 会議室の洗い替えを行う
        var meetingRooms = $("#MeetingRoomDropDownList");
        meetingRooms.empty();
        meetingRooms.append($("<option />"));
        $(result).each(function (index, item) {
          meetingRooms.append(
              $("<option />")
                  .val(item.meetingRoomId)
                  .text(item.meetingRoomName)
              );
        });
      }
    });
  });

  ...

});

 (1)changeメソッドを使い、場所変更時の処理を登録する:jQueryのchangeファンクションを使うことで、対象項目を変更した際に呼び出される処理を登録できます。

 (2)ajaxメソッドを使い、場所を送信し会議室データの取得、洗い替えを行う:jQuery AJAX APIの中でももっとも根幹となるajaxファンクションを使うことで、AJAX処理を実装します。

 引数の意味はそれぞれ次のとおりです。

url データの送信先URLを設定する。
今回は[1]で作成したジェネリックハンドラーを指定する。
type 使用するHTTPメソッドを指定する。
今回はQueryStringで場所情報を渡すため、"GET"を使用する。
data サーバーに送信するデータを設定する。このデータがQueryStringに設定される。
data-type サーバーから返却されるデータの種類を設定する。
正しく設定することで、サーバーからの返却データを文字列ではなく、
オブジェクトとして扱えるようになる。
success サーバーから処理が返ってきた時に呼び出されるコールバックファンクションを設定する。

 (3)サーバーからの返却値のデータから会議室を洗い替える:サーバーからの返却値はsuccessに設定したファンクションの引数に設定されます。この値を使い、一度会議室をクリアし、会議室を追加しなおすことで洗い替えを行います。

 なお、追加処理はjQuery.eachファンクションを使って行うと簡単です。eachファンクションの第二引数には帰ってきた会議室データのオブジェクトが渡されますので、そのままフィールドにアクセスが可能です。

 以上で実装は完了です。実際に動作させ、場所を変更すると会議室が絞り込まれることを確認してみてください。

ASP.NET AJAXの導入

 続いてASP.NET AJAXを用いた場合について説明していきましょう。

ASP.NET AJAXとは

 ASP.NET WebフォームアプリケーションでAJAXを活用したい場合、一番簡単なのはASP.NET 3.5から標準装備となった「ASP.NET AJAX」を使うことです。ASP.NET AJAXでは、ScriptManagerコントロール、UpdatePanelコントロールを使うことで、従来の非AJAXのWebフォームをほとんど変えずにAJAX化することができます。

 簡単に動作原理を説明しておきましょう。

 UpdatePanelコントロール内にコントロールを置き、ボタンなどでSubmitすると、ページ全体が非同期にPostBackされます。非同期PostBack自体は、ScriptManagerコントロールによって自動で生成されたJavaScriptコードにより行われます。

 サーバーサイドでは処理を行った後、処理結果のUpdatePanelのデータだけブラウザに戻します。

 そして、UpdatePanelコントロールの内部が動的に書き換えられます。

図3:ASP.NET AJAXによる非同期PostBack
図3:ASP.NET AJAXによる非同期PostBack

 UpdatePanelは便利ですが、使用時には次のような点に注意が必要です。

頻繁な非同期​ポストバックを行わない

  上述のとおりページ全体をサーバーに送ってしまいますので、あまりに頻繁に非同期ポストバックを行うと、ネットワークに負荷がかかってしまいます。

不要なViewStateは無効にする

  本連載の第4回でも説明した通り、ViewStateに格納された値が大きいと、それだけネットワークに負荷がかかります。それが非同期ポストバックになれば、より頻度が高くなるため、なおのこと気を付けなければなりません。

UpdatePanelと互換性のないサーバーコントロールの存在

  Loginコントロールなど、UpdatePanelの内部に配置しても動作しないコントロールがいくつかあります。

 詳しくは「UpdatePanelコントロールと互換性のないコントロール」セクションを参照してください。

 非同期ポストバックのリクエスト、レスポンスデータの詳細などは、「[ASP.NET AJAX]UpdatePanelコントロール利用時の注意点とは?[2.0のみ、C#、VB]」の記事を参照してください。

次のページ
まとめ

この記事は参考になりましたか?

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。< WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での 登録メンバ は約50名で、現在も執筆メンバを 募集中 。興味のある方は、どしどし応募頂きたい。 著書 記事 多数。 RSS X: @WingsPro_info (公式)、 @WingsPro_info/wings (メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6898 2012/12/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー