.NET TIPS

[ASP.NET AJAX]クライアントサイド・スクリプトからASP.NETのプロファイル機能を利用するには?[2.0のみ、C#、VB]

山田 祥寛
2007/10/11

 「TIPS:[ASP.NET AJAX]クライアントサイド・スクリプトからXML Webサービスを非同期呼び出しするには?(サーバサイド編)」で紹介したとおり、ASP.NET AJAXでは「サービス・ブリッジ機能」を利用することで、クライアントサイド・スクリプト(JavaScript)からサーバ側に用意されたサービスにアクセスすることが可能になる。この際、XMLHttpRequestオブジェクトなどの原始的な通信の手続きを一切意識することなく、あたかもローカルで動作しているライブラリであるかのように利用できるのが、サービス・ブリッジ機能のうれしいポイントだ。

 サービス・ブリッジ機能は、さらに「Webサービス・ブリッジ」と「アプリケーション・サービス・ブリッジ(以降、アプリケーション・ブリッジ)」に分類できるが、要は、前者が自作した任意のサーバ側ロジックを実行するための機能であるのに対して、後者はASP.NET 2.0であらかじめ用意された機能(サービス)を実行するための機能であると考えていただければよいだろう。

 本稿では、これらサービス・ブリッジ機能のうち、アプリケーション・ブリッジ機能を利用して、クライアントサイド・スクリプトからASP.NETが提供するプロファイル機能にアクセスするための方法について紹介する。プロファイル機能を利用することで、(例えば)AJAXで動的に変化させたページの状態をユーザー単位に保存し、次回のアクセス時に保存時の状態に戻すというような操作も可能になる。ASP.NETのプロファイル機能については、「TIPS:[ASP.NET]ユーザーごとのプロファイル情報を管理するには?」で解説しているので、併せて参照していただきたい。

 ここで紹介するサンプルは、アプリケーション・ブリッジ機能を利用したごく基本的なサンプルで、「TIPS:[ASP.NET AJAX]ResizableControlコントロールで画像/テキスト領域のサイズ変更を行うには?」で紹介したサンプル・アプリケーションResizableControl.aspxを改変して、現在のパネル・サイズをプロファイルとして保存するものだ。これによって、ページを閉じるタイミングでのパネル・サイズがユーザーごとに保存され、次のアクセス時には、前回と同じサイズで表示することができる。

 次の画面はその実行例である。

パネルを拡大してページを閉じ、再度同じページにアクセスする
プロファイル機能によって現在のパネル・サイズを保存
ページを閉じるときのパネルの大きさをプロファイル保存し、次のアクセス時にはデフォルトでその大きさで表示する。

 それではさっそく、具体的な実装手順を追っていくことにしよう。なお前述したように、本サンプルを作成するに当たってはResizableControl.aspxをベースにしている。ResizableControl.aspxについては、前掲のTIPSで解説しているので、ResizableControlコントロールで利用可能なプロパティなども含め、詳細はそちらで確認していただきたい。

1. プロファイル機能を利用するための準備を行う(1)

 プロファイル機能を利用するためには、アプリケーション構成ファイル(Web.config)に対して、以下のようにプロファイル・プロパティの登録を行っておく必要がある。個々の要素/属性の意味については、前述の「TIPS:[ASP.NET AJAX]ResizableControlコントロールで画像/テキスト領域のサイズ変更を行うには?」で紹介しているので、併せてそちらも参照していただきたい。

 ここでは、整数型のプロファイル・プロパティResizeHeight(パネルの高さ)、ResizeWidth(パネルの幅)をそれぞれ定義している(デフォルト値はいずれも100)。

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  ……中略……
  <system. web>
    ……中略……
    <profile enabled="true">
      <properties>
        <add name="ResizeHeight" type="System.Int32" defaultValue="100" />
        <add name="ResizeWidth" type="System.Int32" defaultValue="100"/>
      </properties>
   </profile>
  </system. web>
  ……中略……
</configuration>
ASP.NET AJAXのプロファイル・サービスを有効にするコード(Web.config)

2. プロファイル機能を利用するための準備を行う(2)

 もっとも、1の手順だけではASP.NET AJAXからプロファイル機能にアクセスすることはできないので注意。アプリケーション・ブリッジ機能を利用する場合には、ASP.NET AJAXから利用可能なプロファイル・プロパティを宣言しておく必要があるのだ。

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  ……中略……
  <system.web.extensions>
    <scripting>
      <webServices>
        ……中略……
        <profileService enabled="true"
          readAccessProperties="ResizeHeight,ResizeWidth"
          writeAccessProperties="ResizeHeight,ResizeWidth" />
      </webServices>
      ……中略……
    </scripting>
  </system. web.extensions>
  ……中略……
</configuration>
ASP.NET AJAXのプロファイル・サービスを有効にするコード(Web.config)

 ASP.NET AJAXのプロファイル機能を有効にするのは、<profileService>要素のenabled属性の役割だ。また、readAccessProperties/writeAccessProperties属性でクライアントサイド・スクリプトからアクセス可能なプロファイル・プロパティを宣言しておく必要がある(複数ある場合にはカンマ区切り)。

 特別な値として“*”(アスタリスク)を指定することで、サーバサイドで定義されたすべてのプロファイル項目を有効にすることも可能であるが、無条件にプロファイル・プロパティをクライアントサイドに公開することは、時として脆弱性の一因となることもある。通常は、必要なプロファイル・プロパティだけを公開するようにするべきだろう。

3. ページ・ロード時に実行されるイベント・ハンドラを定義する(サーバサイド)

 次に、ResizableControl.aspxに、ページ・ロード時に実行されるPage_Loadイベント・ハンドラを定義しておく。ここでは、プロファイル・プロパティResizeHeight/ResizeWidthに保存された値を、Panelコントロール“presize”のHeight/Widthプロパティにセットすることで、プロファイルの内容をページに反映させている。

protected void Page_Load(Object sender, System.EventArgs e){
  presize.Height = Profile.ResizeHeight;
  presize.Width = Profile.ResizeWidth;
}
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  presize.Height = Profile.ResizeHeight
  presize.Width = Profile.ResizeWidth
End Sub
プロファイル・プロパティの値をパネルに反映させるコード(ResizableControl.aspx。上:C#、下:VB)

4. プロファイル機能にアクセスするためのクライアントサイド・スクリプトを記述する

 最後に、ResizableControl.aspxにプロファイル・プロパティにアクセスするためのクライアントサイド・スクリプトを追加しよう。なお、Resized関数はResizableControlコントロールがリサイズされたタイミングで呼び出される関数で、あらかじめResizableControl.OnClientResizeプロパティに「Resize」と指定しておく必要がある。

<script language="javascript" type="text/javascript">
<!--
// ResizableControlコントロールがリサイズされたタイミングで実行
function Resized() {
  // ResizableControlコントロールの現在のサイズを、
  // プロファイル・プロパティに保存
  var beh = $find("rce");
  var siz = beh.get_Size();
  Sys.Services.ProfileService.properties.ResizeHeight = siz.height;
  Sys.Services.ProfileService.properties.ResizeWidth  = siz.width;
  Sys.Services.ProfileService.save(
    null,
    function() {},
    OnFailed,
    null);
}

// プロファイル書き込み/読み込み失敗時に呼び出されるコールバック関数
function OnFailed(err, context, name){
  window.alert("エラーが発生しました。\r\n" + err.get_message());
}
// -->
</script>
JavaScript経由でユーザー・プロファイルにアクセスするコード

 コードの大まかな流れはコード内のコメントを見ていただくとして、ここで注目していただきたいのは、プロファイル機能にアクセスする役割を担うSys.Services.ProfileServiceオブジェクトだ。

 Sys.Services.ProfileServiceオブジェクトはAJAX Libraryで提供されるJavaScriptのオブジェクトで、以下のようなメンバを公開している。

メンバ 概要
[F]properties 個々のプロファイル・プロパティを取得
[M]load プロファイル・プロパティを読み込み
[M]save プロファイル・プロパティに書き込み
[P]defaultLoadCompletedCallback デフォルトの成功コールバック(読み込み時)
[P]defaultSaveCompletedCallback デフォルトの成功コールバック(書き込み時)
[P]defaultFailedCallback デフォルトの例外コールバック
[P]path プロファイル・サービスのパス
[P]timeout プロファイル問い合わせのタイムアウト時間(秒)
Sys.Services.ProfileServiceオブジェクトの主なメンバ([M]はメソッド、[P]はプロパティ、[F]はフィールド*
* プロパティを参照/設定するには、プロパティ名について直接ではなく、「クラス名.get_プロパティ名()」「クラス名.set_プロパティ名(設定値)」のように、アクセサ・メソッド経由でアクセスしなければならない点に注意(フィールドは、そのままフィールド名でアクセスが可能)。

 プロファイル・プロパティをサーバ側に保存するには、まずSys.Services.ProfileService.propertiesフィールドを介して、個々のプロファイル・プロパティに値を設定する。

Sys.Services.ProfileService.properties.プロパティ名 = 値;

 もっとも、この時点ではまだサーバ側にプロファイル値は反映されていないので注意してほしい。最終的に値を保存するのは、saveメソッドの役割だ。saveメソッドの基本的な構文は、以下のとおり。

Sys.Services.ProfileService.save(
  保存するプロパティ名,
  成功コールバック,
  例外コールバック,
  コンテキスト値
)

 成功/例外コールバック、コンテキスト値については、すでに「TIPS:[ASP.NET AJAX]クライアントサイド・スクリプトからXML Webサービスを非同期呼び出しするには?(クライアントサイド編)」で紹介したとおりなので、そちらも併せて参照いただきたい。

 saveメソッドの第1パラメータは、サーバ側に書き込むべきプロパティ名を文字列配列として指定するものだ。本サンプルのようにnullを指定した場合には、先ほど、手順2で宣言されたプロファイル・プロパティすべてが読み込まれる。

 ここでは、ResizableControlコントロールの現在のサイズ(Sizeプロパティ)を読み込み、これをプロファイル・プロパティResizeHeight/ResizeWidthにそれぞれセットしているわけだ。Sizeプロパティは、ResizableControlコントロールのBehaviorオブジェクト(=コントロールのクライアントサイドの挙動を制御するJavaScriptオブジェクト)で定義されたプロパティで、width/heightという名前のプロパティを含むオブジェクトを返す。

 なお、$find関数はAJAX Libraryで提供されるショートカット関数の1つで、ページ上のBehaviorオブジェクトを検索するための機能を提供するものだ。$find関数の引数には、BehaviorオブジェクトのID値(デフォルトでコントロールのID値)を指定すればよい。

[参考]

 本サンプルでは利用していないが、ASP.NET AJAXからプロファイル・プロパティを読み込むのは、Sys.Services.ProfileService.loadメソッドの役割だ。loadメソッドの構文は、以下のとおり。

Sys.Services.ProfileService.load(
  ロードするプロパティ名,
  成功コールバック,
  例外コールバック,
  コンテキスト値
)
Sys.Services.ProfileService.loadメソッドの構文

 loadメソッドの構文は、saveメソッドと同様であるので、ことさらに特筆すべき点はない。loadメソッドでプロファイル・プロパティを読み込んだら、あとは簡単だ。成功コールバック関数の中で、Sys.Services.ProfileService.propertiesフィールドにアクセスすることで、個々のプロファイル・プロパティにアクセスすることができる。

 以上で、クライアントサイドからプロファイル機能にアクセスするための手順は完了だ。作成したサンプル・プログラムを実行し、実際にプロファイル機能の動作を確かめてみよう。パネルをリサイズしたうえでいったんページを閉じ、再びページにアクセスしたときに前回のパネル・サイズが維持されていれば成功である。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:ASP.NET AJAX
使用キーワード:<profileService>要素、enabled属性
使用キーワード:<profileService>要素、readAccessProperties属性
使用キーワード:<profileService>要素、writeAccessProperties属性
使用キーワード:Sys.Services.ProfileServiceオブジェクト
関連TIPS[ASP.NET AJAX]クライアントサイド・スクリプトからXML Webサービスを非同期呼び出しするには?(サーバサイド編)
関連TIPS:[ASP.NET]ユーザーごとのプロファイル情報を管理するには?
関連TIPS:[ASP.NET AJAX]ResizableControlコントロールで画像/テキスト領域のサイズ変更を行うには?
関連TIPS:[ASP.NET AJAX]クライアントサイド・スクリプトからXML Webサービスを非同期呼び出しするには?(クライアントサイド編)

この記事と関連性の高い別の.NET TIPS
[ASP.NET AJAX]DragPanelコントロールのパネル位置を保存するには?
[ASP.NET]ユーザーごとのプロファイル情報を管理するには?
[ASP.NET AJAX]クライアントサイド・スクリプトからASP.NETの認証機能を利用するには?
[ASP.NET]匿名ユーザーごとのプロファイル情報を保存するには?
[ASP.NET AJAX]ResizableControlコントロールで画像/テキスト領域のサイズ変更を行うには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間