サーバー コントロール

作成者: 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" は、トリプレットを表します。 トリプレットには ArrayList のペアが含まれています ("l" は ArrayList を表します)。これらの ArrayList の 1 つに、値が 1 の Int32 ("i") が含まれており、もう 1 つは別のトリプレットを含みます。 トリプレットには ArrayLists などのペアが含まれています。覚えておくべき重要なことは、ペアを含むトリプレットを使用し、文字を介してデータ型を識別し、区切り記号として および > 文字を使用<することです。

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

-1368920138 d 
 d 
 
 
 SD 
 dddWc A ('ڮ

デコードされたビューステートの外観が大きく変化していることがわかります。 この変更には、いくつかのアーキテクチャの基盤があります。 ASP.NET 1.x の表示状態では、LosFormatter を使用してデータをシリアル化しました。 2.0 では、新しい ObjectStateFormatter クラスを使用します。 このクラスは、ビューステートと制御状態のシリアル化と逆シリアル化を支援するように特別に設計されました。 (コントロールの状態については、次のセクションで説明します)。シリアル化と逆シリアル化が行われる方法を変更することで得られる利点は多数あります。 最も劇的なものの 1 つは、TextWriter を使用する LosFormatter とは異なり、ObjectStateFormatter は BinaryWriter を使用するという事実です。 これにより、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非表示フォーム フィールドのビューステートと共に保持されます。

このビデオでは、ビューステートとコントロール状態のチュートリアルを示します。

Windows エクスプローラー ブラウザー ウィンドウを示すビューステートフィールドとコントロール状態フィールドを説明するチュートリアル ビデオのスクリーンショット。

ビデオFull-Screen開く

サーバー コントロールが状態を制御するための読み取りと書き込みを行うには、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>

このモデルを使用すると、コントロール開発者が特定のデバイスまたはブラウザーをターゲットにすることが非常に簡単になります。 また、開発者がすべてのデバイスでページをレンダリングする方法を完全に制御することも非常に簡単です。

Per-Device レンダリング

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>

このラベルを含むページがインターネット エクスプローラーから参照されると、ラベルに "インターネット エクスプローラーから参照しています" というテキストが表示されます。Firefox からページを参照すると、ラベルに "You are browse from Firefox" というテキストが表示されます。ページが他のデバイスから参照されると、"不明なデバイスから参照しています" と表示されます。この特殊な構文を使用して、任意のプロパティを指定できます。

フォーカスの設定

ASP.NET 1.x 開発者は、特定のコントロールに初期フォーカスを設定する方法についてよく寄せられる質問を受けた。 たとえば、ログイン ページでは、ページが最初に読み込まれるときにユーザー ID テキスト ボックスにフォーカスを設定すると便利です。 ASP.NET 1.x では、クライアント側スクリプトを記述する必要があります。 このようなスクリプトは簡単な作業ですが、SetFocus メソッドのおかげで ASP.NET 2.0 では不要になりました。 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 に移動したりできるホットスポットを画像に追加できます。 利用可能なホットスポットの3種類があります。CircleHotSpot、RectangleHotSpot、PolygonHotSpot。 ホットスポットは、Visual Studio のコレクション エディターを介して、またはコード内でプログラムによって追加されます。 イメージにホットスポットを描画するためのユーザー インターフェイスはありません。 ホットスポットの座標とサイズまたは半径を宣言的に指定する必要があります。 また、デザイナーにホットスポットの視覚的な表現はありません。 URL に移動するようにホットスポットが構成されている場合、URL はホットスポットの NavigateUrl プロパティを使用して指定されます。 ポスト バック ホットスポットの場合、PostBackValue プロパティを使用すると、サーバー側のコードで取得できる文字列をポストバックに渡すことができます。

[既定のドット A S P X] ファイル ウィンドウに表示されている HotSpot コレクション エディター画面のスクリーンショット。

図 1: Visual Studio の HotSpot コレクション エディター

BulletedList コントロール

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

順序付けられていないリストの [箇条書きタスク] ドロップダウン メニューのスクリーンショット。[データ ソースの選択] オプションがポイントされています。

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

HiddenField コントロール

HiddenField コントロールは、非表示のフォーム フィールドをページに追加します。この値はサーバー側コードで使用できます。 非表示のフォーム フィールドの値は、通常、ポスト バック間で変更されません。 ただし、悪意のあるユーザーがポストバックする前に値を変更する可能性があります。 この場合、HiddenField コントロールは ValueChanged イベントを発生させます。 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 の FileUpload コントロールには、同じ目的で使用できる新しい HasFile プロパティが追加され、もう少し効率的です。

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 の場合、バッファーが大きなオブジェクト ヒープに格納されないようにします。

ウィザード コントロール

パネルを使用したり、ページ間で転送したりして、一連の "ページ" で情報を収集しようと苦労している ASP.NET 開発者に遭遇するのは非常に一般的です。 多くの場合、努力はフラストレーションを感じさせ、時間がかかります。 新しいウィザード コントロールは、ユーザーが使い慣れたウィザード インターフェイスで線形および非線形の手順を実行できるようにすることで、問題を解決します。 ウィザード コントロールは、一連の手順で入力フォームを表示します。 各ステップは、コントロールの StepType プロパティで指定された特定の型です。 使用できるステップの種類は次のとおりです。

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

Note

Wizard コントロールは、ASP.NET コントロールの状態を使用してその状態を追跡します。 そのため、EnableViewState プロパティを false に設定しても、悪影響を受けることなく設定できます。

このビデオは、ウィザード コントロールのチュートリアルです。

ウィザード コントロールのビデオ チュートリアルのスクリーンショット。Microsoft Visual Studio ウィンドウが表示された [サーバー コントロール] 画面が表示されます。

ビデオFull-Screen開く

コントロールをローカライズする

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

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

MultiView コントロールとビュー コントロール

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

置換コントロール

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

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

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

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

GridView コントロール

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

DetailsView コントロール

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

FormView コントロール

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

AccessDataSource コントロール

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

ObjectDataSource コントロール

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

XmlDataSource コントロール

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

SiteMapDataSource コントロール

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

SiteMapPath コントロール

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

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

TreeView コントロール

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

ログイン コントロール

ログイン コントロールは、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 パーツが付属しています。 これらは、後のモジュールで詳しく説明します。