サーバー コントロール

作成者: Microsoft

ASP.NET 2.0 では、さまざまな方法でサーバー コントロールが強化されています。 このモジュールでは、ASP.NET 2.0 と Visual Studio 2005 によるサーバー コントロールの処理方法へのアーキテクチャの変更をいくつか説明します。

ASP.NET 2.0 では、さまざまな方法でサーバー コントロールが強化されています。 このモジュールでは、ASP.NET 2.0 と Visual Studio 2005 によるサーバー コントロールの処理方法へのアーキテクチャの変更をいくつか説明します。

ビュー状態

ASP.NET 2.0 のビュー状態に対する主な変更は、大幅なサイズ縮小です。 予定表コントロールのみのページについて考えてみてください。 ASP.NET 1.1 のビュー状態を次に示します。

dDwtMTg1NDkwMjc0Nzt0PDtsPGk8MT47PjtsPHQ8O2w8aTwxPjs
+O2w8dDxAMDxwPHA8bDxTRDs+O2w8bDxTeXN0ZW0uRGF0ZVRpbWUsIG1
zY29ybGliLCBWZXJzaW9uPTEuMC41MDAwLjAsIEN1bHR1cmU9bmV1dHJ
hbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwyMDA1LTE
xLTA4Pjs+Oz4+Oz47Ozs7Ozs7Ozs7Pjs7Pjs+Pjs+Pjs+lkX2YWqfACtP
/VWr8G03pob/+tU=

次に、ASP.NET 2.0 の同じページのビュー状態を示します。

/wEPDwULLTEzNjg5MjAxMzgPZBYCAgMPZBYCAgEPPCsAC
gEADxYCHgJTRBYBBgDAEX8OsscIZGRkllfArINjlhvzQX7Xfign2q6HK5E=

この変更はかなり大きく、ビュー状態がネットワーク上でやり取りされることを考えると、この変更によって、開発者のパフォーマンスを大幅に向上させることができます。 ビュー状態のサイズ縮小は主に、内部的な処理方法に起因します。 ビュー状態は Base64 でエンコードされた文字列であることを忘れないでください。 ASP.NET 2.0 でのビュー状態の変化をより良く理解するために、上記の例からデコードされた値を見てみましょう。

デコードされた 1.1 のビュー状態を次に示します。

t<-1854902747;t<;l<i<1>;>;l<t<;l<
i<1>;>;l<t<@0<p<p<l<SD;>;l<l<
System.DateTime, mscorlib, Version=1.0.5000.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089<2005-11-08>;>;>>;
>;;;;;;;;;;>;;>;>>;>>;>Eaj

少し意味不明のように見えるかもしれませんが、ここにはパターンがあります。 ASP.NET 1.x では、単一の文字を使用してデータ型を特定し、<> 文字を使用して値を区切っていました。 上記のビュー状態サンプルの "t" はトリプレットを表します。 そのトリプレットには、ArrayLists のペアが含まれています ("l" は ArrayList を表します)。その ArrayLists の一方には、値が 1 の Int32 ("i") が含まれており、もう一方には、別のトリプレットを含まれています。 そのトリプレットには、ArrayLists のペアなどが含まれています。覚えておくべき重要なことは、ペアを含むトリプレットを使用すること、文字によってデータ型を特定すること、そして区切り記号として < および > 文字を使用することです。

ASP.NET 2.0 では、デコードされたビュー状態は少し異なって見えます。

-1368920138 d 
 d 
 
 
 SD 
 dddWc A ('ڮ

デコードされたビュー状態の表示が大きく変わっているのがわかります。 この変化には、アーキテクチャ上の裏付けがいくつかあります。 ASP.NET 1.x のビュー状態では、データのシリアル化に LosFormatter を使用しました。 2.0 では、新しい ObjectStateFormatter クラスを使用します。 このクラスは、ビュー状態とコントロール ステートのシリアル化と逆シリアル化を支援するために特別に設計されたものです (コントロール ステートについては、次のセクションで説明します)。シリアル化と逆シリアル化の方法を変更することで得られるメリットは多数あります。 最も大きなメリットの 1 つが、ObjectStateFormatter では BinaryWriter が使用されるという事実で、TextWriter が使用される LosFormatter とは異なります。 これにより、ASP.NET 2.0 では、ビュー状態を、文字列ではなく一連のバイトとして保存できます。 たとえば、整数について考えます。 ASP.NET 1.1 では、整数に 4 バイトのビュー状態が必要でした。 ASP.NET 2.0 では、同じ整数に 1 バイトのみが必要です。 また、保存されるビュー状態の量を減らすための機能強化も行われました。 たとえば、DateTime 値が、文字列ではなく TickCount を使用して保存されるようになりました。

まだまだあります。特に注意が払われたのは、1.x でビュー状態の最大のコンシューマーの 1 つが、DataGrid および同様のコントロールだったという事実です。 ビュー状態が関係する DataGrid などのコントロールの主な欠点は、多くの場合、大量の繰り返し情報が含まれていることです。 ASP.NET 1.x では、その繰り返しの情報が単純に何度も保存されたため、ビュー状態が肥大化しました。 ASP.NET 2.0 では、新しい IndexedString クラスを使用して、このようなデータが保存されます。 文字列が繰り返される場合は、IndexedString のトークンとインデックスが単に、IndexedString オブジェクトの実行中のテーブル内に保存されます。

コントロール ステート

ビュー状態に対して開発者が抱いていた主な不満の 1 つが、HTTP ペイロードに追加されたサイズでした。 前述のように、ビュー状態の最も優れたコンシューマーの 1 つは DataGrid コントロールです。 DataGrid によって生成される大量のビュー状態を回避するために、開発者の多くは単純にそのコントロールのビュー状態を無効にします。 残念ながら、そのソリューションは必ずしも良いものではありませんでした。 ASP.NET 1.x のビュー状態に含まれているのは、コントロールの正しい機能に必要なデータだけではありません。 これには、コントロールの UI の状態に関する情報も含まれています。 つまり、DataGrid で改ページを許可したいときは、ビュー状態に含まれる UI 情報の中に不要なものがある場合でも、ビュー状態を有効にする必要があります。 これは、オールオアナッシングのシナリオです。

ASP.NET 2.0 では、コントロール ステートが導入され、この問題がうまく解決されています。 コントロール ステートには、コントロールが適切に機能するのに必ず必要なデータが含まれます。 ビュー状態とは異なり、コントロール ステートは無効にできません。 そのため、コントロール ステートに保存されるデータは慎重に制御することが重要です。

Note

コントロール ステートは、非表示の __VIEWSTATE フォーム フィールドのビュー状態と共に保持されます。

この動画は、ビュー状態とコントロール ステートのチュートリアルです。

Screenshot of the walkthrough video that describes the view state and control state fields, showing a Windows Explorer browser window.

全画面表示で動画を開く

サーバー コントロールがコントロール ステートの読み取りと書き込みを行うには、3 つの手順を実行する必要があります。

手順 1: RegisterRequiresControlState メソッドを呼び出す

RegisterRequiresControlState メソッドにより、コントロールがコントロール ステートを保持する必要があることが ASP.NET に通知されます。 これは、登録されているコントロールである Control 型の 1 つの引数を取ります。

重要なのは、要求が行われた後、次の要求まで登録が保持されない点に注意することです。 このため、コントロールがコントロール ステートを保持するには、要求ごとにこのメソッドを呼び出す必要があります。 メソッドは、OnInit で呼び出すことをお勧めします。

protected override void OnInit(EventArgs e) { Page.RegisterRequiresControlState(this); base.OnInit(e); }

手順 2: SaveControlState をオーバーライドする

SaveControlState メソッドでは、最後のポストバック以降に行われた、コントロールのコントロール ステートの変更が保存されます。 これは、コントロールの状態を表すオブジェクトを返します。

手順 3: LoadControlState をオーバーライドする

LoadControlState メソッドにより、保存された状態がコントロールに読み込まれます。 このメソッドは、コントロールの保存された状態が保持されている Object 型の 1 つの引数を取ります。

完全な XHTML 準拠

Web 開発者であれば、Web アプリケーションにおける標準の重要性はわかっています。 標準ベースの開発環境を維持する目的で、ASP.NET 2.0 は XHTML に完全に準拠しています。 したがって、HTML 4.0 以降をサポートするブラウザーでは、すべてのタグが XHTML 標準に従ってレンダリングされます。

ASP.NET 1.1 の DOCTYPE 定義は次のとおりです。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN

ASP.NET 2.0 の既定の DOCTYPE 定義は次のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

必要に応じて、構成ファイルの xhtmlConformance ノードを使用して、既定の XHTML 準拠を変更できます。 たとえば、web.config ファイル内の次のノードにより、XHTML 準拠が XHTML 1.0 Strict に変更されます。

<xhtmlConformance mode="Strict" />

必要に応じて、次に示すように、ASP.NET 1.x で使用されるレガシ構成を使用するよう ASP.NET を構成することもできます。

<xhtmlConformance mode="Legacy" />

アダプターを使用したアダプティブ レンダリング

ASP.NET 1.x では、HttpBrowserCapabilities オブジェクトを設定する <browserCaps> セクションが構成ファイルに含まれていました。 このオブジェクトを使用することで、開発者は、特定の要求を行っているデバイスを特定し、コードを適切にレンダリングできました。 ASP.NET 2.0 では、モデルが改良され、新しい ControlAdapter クラスが使用されるようになりました。 ControlAdapter クラスは、コントロールのライフサイクル内のイベントをオーバーライドし、コントロールのレンダリングを、ユーザー エージェントの機能に基づいて制御します。 特定のユーザー エージェントの機能は、c:\windows\microsoft.net\framework\v2.0.****\CONFIG\Browsers フォルダーに保存されているブラウザー定義ファイル (ファイル拡張子が .browser のファイル) によって定義されます。

Note

ControlAdapter クラスは抽象クラスです。

1.x の <browserCaps> セクションと同様、ブラウザー定義ファイルは、要求側ブラウザーを特定する目的で、正規表現を使ってユーザー エージェント文字列を解析します。 その後、ユーザー エージェントの特定の機能を定義します。 ControlAdapter では、Render メソッドを介してコントロールがレンダリングされます。 したがって、Render メソッドをオーバーライドする場合は、基底クラスで Render を呼び出さないでください。 これを行うと、レンダリングがアダプターに対して 1 回、コントロール自体に対して 1 回、合わせて 2 回発生することがあります。

カスタム アダプターの開発

ControlAdapter から継承することで、独自のカスタム アダプターを開発できます。 さらに、ページにアダプターが必要な場合は、抽象クラス PageAdapter から継承することができます。 カスタム アダプターへのコントロールのマッピングは、ブラウザー定義ファイルの <controlAdapters> 要素を使用して実行されます。 たとえば、ブラウザー定義ファイルの次の XML により、Menu コントロールが MenuAdapter クラスにマップされます。

<controlAdapters> <adapter controlType="System.Web.UI.WebControls.Menu" adapterType="System.Web.UI.WebControls.Adapters.MenuAdapter" /> </controlAdapters>

このモデルを使用すると、コントロール開発者が非常に簡単に、特定のデバイスやブラウザーをターゲットにできるようになります。 さらに、開発者は、あらゆるデバイスでページがどのようにレンダリングされるかを、非常に簡単に完全に制御できます。

デバイスごとのレンダリング

ASP.NET 2.0 のサーバー コントロール プロパティは、ブラウザー固有のプレフィックスを使用してデバイスごとに指定できます。 たとえば、次のコードによって、ラベルのテキストが、ページの閲覧に使用されているデバイスに応じて変更されます。

<asp:Label ID="lblBrowser" runat="server" Text="You are browsing from an unknown device." ie:Text="You are browsing from Internet Explorer." mozilla:Text="You are browsing from Firefox."> </asp:Label>

このラベルを含むページが Internet Explorer から閲覧された場合、ラベルには "You are browse from Internet Explorer" というテキストが表示されます。Firefox からこのページが閲覧されると、"You are browse from Firefox" というテキストがラベルに表示されます。他のデバイスからページが閲覧された場合は、"You are browsing from an unknown device" と表示されます。この特殊な構文を使用して、任意のプロパティを指定できます。

フォーカスの設定

ASP.NET 1.x 開発者からは、特定のコントロールに最初のフォーカスを設定する方法をよく聞かれました。 たとえば、ログイン ページの場合、ページが最初に読み込まれたとき、ユーザー ID テキスト ボックスにフォーカスがあると便利です。 ASP.NET 1.x でこれを行うには、クライアント側のスクリプトを記述する必要がありました。 このようなスクリプトは簡単な作業ですが、ASP.NET 2.0 では、SetFocus メソッドによってこれが不要になりました。 SetFocus メソッドは、フォーカスを受け取るコントロールを示す引数を 1 つ取ります。 この引数には、コントロールのクライアント ID を文字列で指定することも、Server コントロールの名前を Control オブジェクトとして指定することもできます。 たとえば、ページが最初に読み込まれたときの最初のフォーカスを、txtUserID という TextBox コントロールに設定するには、次のコードを Page_Load に追加します。

if (!IsPostBack) {
    SetFocus(txtUserID);
}

または

if (!IsPostBack) {
    SetFocus(txtUserID.ClientID);
}

ASP.NET 2.0 では、(前述した) Webresource.axd ハンドラーを使用して、フォーカスを設定するクライアント側の関数がレンダリングされます。 次に示すように、クライアント側の関数の名前は WebForm_AutoFocus です。

<script type="text/javascript"> <!-- WebForm_AutoFocus('txtUserID'); // --> </script>

または、コントロールの Focus メソッドを使用して、最初のフォーカスをそのコントロールに設定することもできます。 Focus メソッドは Control クラスから派生したもので、すべての ASP.NET 2.0 コントロールで使用できます。 検証エラーが発生したときのフォーカスを、特定のコントロールに設定することもできます。 これについては、後のモジュールで説明します。

ASP.NET 2.0 の新しいサーバー コントロール

ここでは ASP.NET 2.0 の新しいサーバー コントロールを紹介します。 そのうちのいくつかについては、後のモジュールで詳しく説明します。

ImageMap コントロール

ImageMap コントロールを使用すると、ホットスポットを画像に追加して、ポストバックを開始したり URL に移動したりできます。 利用可能なホットスポットは、CircleHotSpot、RectangleHotSpot、PolygonHotSpot の 3 種類です。 ホットスポットを追加するには、Visual Studio のコレクション エディターを使用するか、コード内でプログラムを使用します。 画像上でホットスポットを描画するために使用できるユーザー インターフェイスはありません。 ホットスポットの座標とサイズまたは半径は、宣言によって指定する必要があります。 デザイナーにホットスポットの視覚的表現もありません。 URL に移動するようにホットスポットが構成されている場合、URL はホットスポットの NavigateUrl プロパティを使用して指定されます。 ポスト バック ホットスポットの場合、PostBackValue プロパティを使用すると、サーバー側のコードで取得できる文字列をポストバックに渡すことができます。

Screenshot of the HotSpot Collection Editor screen being displayed over the Default dot A S P X file window.

図 1: Visual Studio のホットスポット コレクション エディター

BulletedList コントロール

BulletedList コントロールは、簡単にデータをバインドできる箇条書きです。 この箇条書きは、BulletStyle プロパティを使用して順序指定 (番号付け) または順序指定解除が可能です。 箇条書き項目はそれぞれ、ListItem オブジェクトによって表されます。

Screenshot of the Bulleted List tasks dropdown menu over an unordered list, with the Choose Data Source option being hovered over.

図 2: Visual Studio の BulletedList コントロール

HiddenField コントロール

HiddenField コントロールにより、非表示のフォーム フィールドがページに追加されます。この値はサーバー側のコードで使用できます。 非表示のフォーム フィールドの値は、通常、ポスト バック間で変更されることはありません。 しかし、この値は、悪意のあるユーザーによって、ポスト バックの前に変更される可能性があります。 これが発生すると、ValueChanged イベントが HiddenField コントロールによって発生します。 HiddenField コントロールに機密情報があり、その情報が変更されないようにしたい場合は、コードで ValueChanged イベントを処理する必要があります。

FileUpload コントロール

ASP.NET 2.0 の FileUpload コントロールを使用すると、ASP.NET ページを介して Web サーバーにファイルをアップロードできます。 このコントロールは、若干の例外はあるものの、ASP.NET 1.x HtmlInputFile クラスとよく似ています。 ASP.NET 1.x では、適切なファイルがあるかどうかを判断するために、PostedFile プロパティに null があるかどうかをチェックすることが推奨されていました。 ASP.NET 2.0 では、同じ目的で使用できる新しい HasFile プロパティが FileUpload コントロールによって追加され、少し効率的になっています。

PostedFile プロパティは引き続き、HttpPostedFile オブジェクトへのアクセスに使用できますが、HttpPostedFile の機能の一部は、FileUpload コントロール自体で使用できるようになっています。 たとえば、ASP.NET 1.x では、アップロードしたファイルを保存するには、HttpPostedFile オブジェクトで SaveAs メソッドを呼び出します。 ASP.NET 2.0 で FileUpload コントロールを使用する場合は、FileUpload コントロール自体で SaveAs メソッドを呼び出します。

また、アップロードされたファイルを保存する前に、そのファイル全体をメモリに読み込む必要がなくなったことも、2.0 の重要な動作変更 (おそらく最も重要な変更) の 1 つです。 1.x では、アップロードされたファイルは、ディスクに書き込まれる前に完全にメモリに保存されました。 このアーキテクチャでは、大きなファイルをアップロードできません。

ASP.NET 2.0 では、httpRuntime 要素の requestLengthDiskThreshold 属性を使用することで、ディスクに書き込まれる前に、メモリのバッファーに保持されるキロバイト数を構成できます。

重要: MSDN のドキュメント (および他の場所のドキュメント) では、この値の単位が (キロバイト単位ではなく) バイトであること、および既定値は 256 であることが明記されています。 値は実際にはキロバイト単位で指定され、既定値は 80 です。 既定値を 80K にすることで、バッファーが大きなオブジェクト ヒープではなくなります。

Wizard コントロール

ASP.NET 開発者が、パネルを使用したりページ間を移動したりして、一連の "ページ" での情報収集に苦労するのはよくあることです。 多くの場合、それはストレスのたまる作業であり、時間もかかります。 新しい Wizard コントロールは、ユーザーが使い慣れたウィザード インターフェイスで線形および非線形のステップを実行できるようにすることで、問題を解決します。 Wizard コントロールは、一連のステップで入力フォームを表示します。 ステップにはそれぞれ種類があり、コントロールの StepType プロパティで指定されています。 使用できるステップの種類は次のとおりです。

ステップの種類 説明
Auto ステップの種類は、ステップ階層内の位置に基づいて、ウィザードによって自動的に決まります。
先頭 最初の手順。多くの場合、導入ステートメントを表示するために使用されます。
手順 通常のステップ。
完了 最後のステップ。通常、ウィザードを完了するボタンを表示するために使用されます。
完了 成功または失敗を伝えるメッセージを表示します。

Note

Wizard コントロールは、その状態を、ASP.NET コントロール ステートを使用して追跡します。 そのため、EnableViewState プロパティを false に設定しても、不都合はありません。

この動画は、Wizard コントロールのチュートリアルです。

Screenshot of a video walkthrough of the Wizard Control. The Server Controls screen with a Microsoft Visual Studio window is displayed.

全画面表示で動画を開く

Localize コントロール

Localize コントロールは Literal コントロールに似ています。 ただし、Localize コントロールには、追加されたマークアップのレンダリング方法を制御する Mode プロパティがあります。 Mode プロパティは、次の値をサポートしています。

Mode 説明
変換 要求を行うブラウザーのプロトコルに従ってマークアップが変換されます。
PassThrough マークアップはそのままレンダリングされます。
エンコード コントロールに追加されるマークアップが、HtmlEncode を使用してエンコードされます。

MultiView および View コントロール

MultiView コントロールは View コントロールのコンテナーとして機能し、View コントロールは他のコントロールのコンテナーとして (Panel コントロールと同様に) 機能します。 MultiView コントロールの各ビューは、1 つの View コントロールで表されます。 MultiView の最初の View コントロールはビュー 0、2 つ目はビュー 1 となります。ビューを切り替えるには、MultiView コントロールの ActiveViewIndex を指定します。

Substitution コントロール

Substitution コントロールは、ASP.NET キャッシュと組み合わせて使用されます。 キャッシュを利用したいが、ページの一部を要求ごとに更新しなければならない場合 (つまり、ページの一部をキャッシュから除外する場合)、Substitution コンポーネントによって優れたソリューションが提供されます。 このコントロールは、実際のところ、それ自体では出力をレンダリングしません。 代わりに、これはサーバー側のコードのメソッドにバインドされます。 ページが要求されると、そのメソッドが呼び出され、返されたマークアップが、Substitution コントロールの代わりにレンダリングされます。

Substitution コントロールのバインド先のメソッドは、MethodName プロパティを使用して指定されます。 そのメソッドは、次の条件を満たしている必要があります。

  • 静的 (VB では共有) メソッドである必要があります。
  • HttpContext 型のパラメーターを 1 つ受け取ります。
  • ページ上のコントロールを置き換えるマークアップを表す文字列を返します。

Substitution コントロールは、ページ上の他のコントロールを変更することはできませんが、そのパラメーターを使用して現在の HttpContext にアクセスすることができます。

GridView コントロール

GridView コントロールは、DataGrid コントロールに代わるものです。 このコントロールについては、後のモジュールで詳しく説明します。

DetailsView コントロール

DetailsView コントロールを使用すると、データ ソースから 1 つのレコードを表示したり、それを編集または削除したりできます。 詳細については、後のモジュールで説明します。

FormView コントロール

FormView コントロールは、構成可能なインターフェイスでデータソースから 1 つのレコードを表示するために使用されます。 詳細については、後のモジュールで説明します。

AccessDataSource コントロール

AccessDataSource コントロールは、Access データベースをデータ バインドするために使用されます。 詳細については、後のモジュールで説明します。

ObjectDataSource コントロール

ObjectDataSource コントロールは、3 層アーキテクチャをサポートするために使用され、コントロールを中間層ビジネス オブジェクトにデータ バインドできるようにします。これは、コントロールがデータ ソースに直接バインドされる 2 層モデルとは対照的です。 詳細については、後のモジュールで説明します。

XmlDataSource コントロール

XmlDataSource コントロールは、XML データ ソースにデータ バインドするために使用されます。 詳細については、後のモジュールで説明します。

SiteMapDataSource コントロール

SiteMapDataSource コントロールは、サイト マップに基づくサイト ナビゲーション コントロールのデータ バインディングを提供します。 詳細については、後のモジュールで説明します。

SiteMapPath コントロール

SiteMapPath コントロールにより、一般的に階層リンクと呼ばれる一連のナビゲーション リンクが表示されます。 詳細については、後のモジュールで説明します。

Menu コントロールにより、DHTML を使用した動的メニューが表示されます。 詳細については、後のモジュールで説明します。

TreeView コントロール

TreeView コントロールは、データの階層ツリー ビューを表示するために使用されます。 詳細については、後のモジュールで説明します。

Login コントロール

Login コントロールは、Web サイトにログインするためのメカニズムを提供します。 詳細については、後のモジュールで説明します。

LoginView コントロール

LoginView コントロールを使用すると、ユーザーのログイン状態に基づいてさまざまなテンプレートを表示できます。 詳細については、後のモジュールで説明します。

PasswordRecovery コントロール

PasswordRecovery コントロールは、ASP.NET アプリケーションのユーザーがパスワードを忘れた場合に、それを取得するために使用されます。 詳細については、後のモジュールで説明します。

LoginStatus

LoginStatus コントロールにより、ユーザーのログイン状態が表示されます。 詳細については、後のモジュールで説明します。

LoginName

LoginName コントロールにより、ASP.NET アプリケーションにログインした後に、ユーザーのユーザー名が表示されます。 詳細については、後のモジュールで説明します。

CreateUserWizard

CreateUserWizard は、ASP.NET アプリケーションで使用する ASP.NET メンバーシップ アカウントを、ユーザーが作成できるようにする構成可能なウィザードです。 詳細については、後のモジュールで説明します。

ChangePassword

ChangePassword コントロールを使用すると、ユーザーが、ASP.NET アプリケーションのパスワードを変更できます。 詳細については、後のモジュールで説明します。

さまざまな Web パーツ

ASP.NET 2.0 にはさまざまな Web パーツが付属しています。 これらの詳細については、後のモジュールで説明します。