連載
» 2002年10月31日 00時00分 公開

第9回 Webフォームにおけるデータ連結 Part1 データ連結とは連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (2/4 ページ)

[田口景介,著]

 

■データ連結式から参照可能なオブジェクト

 こうしてみると、“<%#”と“%>”で囲まれるデータ連結式は、DataBindメソッドから呼び出される1つの式しか記述できない小さなメソッドのようなものだと考えることができるだろう。そう考えると、データ連結式からは、ほかのメソッド内部で定義されたローカル変数などにアクセスできないのは当然のこととして理解できるはずだ。実際のメソッドと同じように、データ連結式から参照できるのは、データ連結式を含む「コンテナ」が公開するフィールドやプロパティ、またはメソッドに制限されているのである。

 先ほどのリスト9.1リスト9.2に示すサンプル・プログラムに登場したデータ連結式の場合、コンテナに当たるのは「ページ」である。第4回の解説の中で、ASP.NETページには、常に対となるPageクラスのサブクラスが定義されると述べたことを覚えているだろうか。コードビハインドを利用するときは明示的に、利用しないときは暗黙的に定義されるこのサブクラスがコンテナである。従って、データ連結式で参照できるのは、Pageクラスのフィールドとメソッド、それに「<script runat="server">」タグ内部で定義されたフィールドとメソッドということになる。また、コードビハインドを利用しないときは、ページに配置されたサーバ・コントロールに対応するフィールドが暗黙的に定義されるため、これも参照することができる(図9.1)。

図9.1 データ連結式から参照可能なオブジェクト
1. Pageクラスのフィールドとメソッド
2. <script runat="server">で定義されたフィールドとメソッド
3. サーバ・コントロール(属性IDの値がフィールド名となる)

 ただし、asp:DataGridコントロールやasp:DataListコントロールのようにコンテナとして機能するサーバ・コントロールの内部にデータ連結式を記述した場合は、ページだけでなく、このサーバ・コントロールもコンテナとして扱われる。こうしたコントロールの扱いについて詳しくは後述する。

■データ連結とビューステート

 ASP.NETの基本的な仕組みの1つに自動状態管理があることを以前解説したが、データ連結の結果もこの仕組みによって保存され、サーバとのラウンド・トリップを越えて維持される。

 この動作をリスト9.3に示すサンプル・プログラムで確認してみよう。このASP.NETページにアクセスすると、下の図9.2に示す状態が表示されるはずだ。このプログラムではPage_Loadメソッドは定義されているが、そこではDataBindメソッドを呼び出していないため、データ連結は行われない。

<%@ PAGE LANGUAGE="C#" EnableViewState="true" %>
<html>
<head>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
}

void Submit(object sender, EventArgs e) {
  DataBind();
}
</script>
</head>
<body>
<form runat="server">
  <asp:Label id="dest" Text="<%# source.Text %>" runat="server"/>
  <asp:TextBox id="source" runat="server"/>
  <asp:Button Text="DataBind" OnClick="Submit" runat="server"/>
  <asp:Button Text="NoDataBind" runat="server"/>
</form>
</body>
</html>

リスト9.3 ビューステートで保存されるデータ連結の結果(sample03.aspx)
sample03.aspxのダウンロード(sample03.zip)


 そこで、次に[DataBind]ボタンをクリックして欲しい。すると、今度はSubmitメソッドが呼び出され、そこでDataBindメソッドが呼び出されるため、データ連結が行われ、テキスト・ボックスの前にテキスト・ボックスに入力された文字列がasp:Labelコントロールによって出力される(図9.3)。

図9.3 sample03.aspxの[DataBind]ボタンをクリックした直後
以後データ連結を行わない[NoDataBind]ボタンをクリックしても、この状態が維持される

 ここまでは当たり前の動作だと思われるが、次に[NoDataBind]ボタンをクリックするとどうなるだろうか。このボタンをクリックしてもPage_Loadメソッドが呼び出されるだけなので、DataBindメソッドが呼び出されることはないにもかかわらず、ラベルの値はそのまま出力される。このように、通常ならばポストバックされない情報が維持されるのは、自動状態管理の一部であるビューステートに、データ連結の結果が保存されているからである。ちなみに、テキスト・ボックスのテキストを修正してから[NoDataBind]ボタンをクリックすると、データ連結は行われないためラベルの値は変更されず、その前に[DataBind]ボタンをクリックしたときのテキストがそのまま表示される。

 このように、データ連結の結果はラウンド・トリップが発生しても維持されるため、必ずしもポストバックされるたびにDataBindメソッドを呼び出す必要はない。データ連結されているオブジェクトの状態が変化したときにのみ呼び出せばよい。

 なお、@PAGEディレクティブに「EnableViewState="false"」を指定してビューステートを無効にすると、データ連結の結果は保存されなくなるため、[NoDataBind]ボタンをクリックすると、ページは図9.2に示す起動直後の状態に戻ってしまう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。