モバイル テキスト ライタ レンダリングのベスト プラクティス
更新 : 2007 年 11 月
レンダリング フェーズでは、すべての ASP.NET モバイル デバイス アダプタが、MobileTextWriter 基本クラスから継承したクラスを使用して出力を書き出します。テキスト ライタの実際のクラスは、対象デバイス固有のクラスになる場合があります。ページ アダプタが適切なライタをインスタンス化して返します。たとえば、cHTML マークアップが必要なデバイスの場合は、CreateTextWriter メソッドに対して ChtmlPageAdapter が ChtmlMobileTextWriter オブジェクトを返します。
MobileTextWriter クラスは各アダプタに共通のプロパティとメソッドのセットを定義します。コントロール アダプタに対しては、そのアダプタのライタ クラス固有の追加のヘルパー メンバを定義できます。MobileTextWriter クラスは HtmlTextWriter 基本クラスを継承するため、Write、WriteLine、WriteBeginTag などの HtmlTextWriter 基本クラスのメソッドを使用できます。
厳密に型指定したレンダリング メソッド
通常、アダプタには固有のクラスのテキスト ライタが必要です。たとえば、WmlPageAdapter は WmlMobileTextWriter オブジェクトを使用する必要があります。IControlAdapter インターフェイスの Render メソッドには、HtmlTextWriter 型のパラメータが含まれます。このため、目的のテキスト ライタ クラスを使用できるようにするには、アダプタが Render メソッドをオーバーライドするか、必要なクラスにライタをキャストする必要があります。
次の例は、カスタム CarControl クラス用の XHTML アダプタ セットにある新しいアダプタで Render メソッドをオーバーライドする方法を示します。このカスタム アダプタの名前は XhtmlCarControlAdapterです。この名前は、新しいアダプタに対して設定される名前付け規則に従っています。
// Specialized XhtmlCarControlAdapter Render method
public void Render(XhtmlMobileTextWriter writer)
{
... [rendering code]
}
// Generic XhtmlCarControlAdapter Render method
public override void Render(HtmlTextWriter writer)
{
Render((XhtmlMobileTextWriter)writer);
}
応答の開始と終了
ページ アダプタは、応答を書き出す前に Render メソッドの特定のメソッドを呼び出す必要があります。次に、ページ アダプタがとる典型的な動作順序を示します。
ライタの BeginResponse メソッドを呼び出します。
ライタの BeginFile メソッドを呼び出し、ページ URL、およびデータに適したコンテンツ型 (MIME 型) を渡します。たとえば、HTML ページ アダプタは、コンテンツ型として text/html を渡します。
ページをレンダリングします (通常、アクティブなフォーム)。
ライタの EndFile メソッドを呼び出します。
ライタの EndResponse メソッドを呼び出します。
次のコード例は、HTML ページ アダプタ用の単純な Render メソッドを示します。
public override void Render(MobileTextWriter writer)
{
writer.BeginResponse();
writer.BeginFile(Page.Request.Url.ToString(), "text/html");
Page.ActiveForm.RenderControl(writer);
writer.EndFile();
writer.EndResponse();
}
出力のエンコード
MobileTextWriter クラスには、レンダリングをエンコードするヘルパー メソッドが用意されています。エンコード方法は対象となるデバイスに応じて異なります。たとえば、WML ベースのデバイスではドル記号 ($) をエンコードする必要があります。用意されているヘルパ メソッドは次のとおりです。
対象デバイス用にエンコードされたテキストを記述するには、アダプタがライタの WriteEncodedText メソッドを呼び出します。
パラメータを含めて URL を対象デバイス用に記述するには、アダプタがライタの WriteEncodedUrl メソッドを呼び出します。
対象デバイス用の URL の引数 (ユーザー エージェント文字列のクエリ記号 "?" に続く URL の一部) を記述するには、アダプタがライタの WriteEncodedUrlParameter メソッドを呼び出します。
出力のキャッシュ
ASP.NET Web ページは、ページ出力のキャッシュをサポートします。ページは、@ OutputCache ディレクティブを使用してキャッシュできます。
モバイル Web ページでは、対象デバイスに応じて、キャッシュされた出力が変わるように設定する必要があります。たとえば、Pocket PC 用の Microsoft Internet Explorer を実行しているデバイスがページを要求した場合、その結果としての出力はキャッシュされるはずですが、Internet Explorer を実行しているデバイスに対してのみに返される必要があります。
既定では、HTTP のユーザー エージェント文字列が、キャッシュされたモバイル Web ページの変更を制御します。ただし、別のプロパティによって、他のデバイスの出力が影響を受ける可能性があります。たとえば、ユーザー エージェント文字列が 1 つだけあるデバイスに複数の画面サイズが設定されている場合は、それぞれの設定で出力が異なる可能性があります。このような個々の条件にも対応できるようにするため、ページ アダプタは CacheVaryByHeaders プロパティをオーバーライドできます。
また、ASP.NET Web のユーザー コントロールも、個々の出力を個別にキャッシュできる @ OutputCache ディレクティブをサポートしています。これは、部分キャッシュと呼ばれます。ただし、モバイル Web ページのユーザー コントロールは、このディレクティブをサポートしていません。モバイル Web ページは部分キャッシュをサポートしていません。これは、ユーザー コントロールの出力が、ページ内の他のコンテンツにより異なる可能性があるからです。