ASP.NET サーバー コントロールのレンダリング

レンダリングとは、表示画面にコントロールのビジュアル表現を作成するプロセスです。Web 要求の場合、実際のレンダリングはクライアントの Web ブラウザまたはその他の表示デバイスによって実行されます。ASP.NET ページ フレームワークの役割は、Web 要求に応答して HTML (または XML や WML などの他のマークアップ言語で作成されたテキスト) を送信することです。ページ (およびページの子コントロール) は、出力ストリームにマークアップ コンテンツを書き込みます。レンダリングのために、System.Web.UI.Control 基本クラスには Render メソッドが用意されています。Render メソッドのシグネチャは次のとおりです。

protected virtual void Render(HtmlTextWriter writer);
[Visual Basic]
Overridable Protected Sub Render(ByVal writer As HtmlTextWriter)

System.Web.UI.HtmlTextWriter クラスは、マークアップ コンテンツを書き込むために出力ストリームをカプセル化します。最も単純な例として、コントロールの作成者は、Render をオーバーライドし、HTML (またはその他のマークアップ コンテンツ) を文字列引数として HtmlTextWriter インスタンスの Write メソッドに渡すことができます。

protected override void Render(HtmlTextWriter output) {
    output.Write ("<h3> Hello </h3>");
}
[Visual Basic]
Protected Overrides Sub Render(output As HtmlTextWriter)
    output.Write("<h3> Hello </h3>")
End Sub

HtmlTextWriter には、HTML の記述を簡略化するユーティリティ メソッドが多数あります。テキスト文字列を Write へ直接渡す代わりに、これらのユーティリティ メソッドを使用することをお勧めします。ユーティリティ メソッドを使用すると、コードの読みやすさと再利用性が向上し、開発者が HTML 構文を詳細に理解する必要もなくなります。これらのユーティリティ メソッドの例については、HtmlTextWriter クラスのトピックを参照してください。HtmlTextWriter には、上位レベルまたは下位レベルのレンダリングのために HTML のバージョンを自動的に変換する機能もあります。

複数の文字列を 1 つの文字列引数に連結して Write メソッドへ渡すよりも、HtmlTextWriter.Write を複数回呼び出す方が効率的です。

**メモ   **このドキュメントのサンプルでは、わかりやすくするために、テキスト文字列を HtmlTextWriter.Write へ直接渡しています。ただし、実際のコントロールでは HtmlTextWriter のユーティリティ メソッドを使用してください。

Control 基本クラスの RenderChildren メソッドは、子コントロールがある場合に子コントロールのコンテンツをレンダリングします。

protected virtual void RenderChildren(HtmlTextWriter writer);
[Visual Basic]
Overridable Protected Sub RenderChildren(ByVal writer As HtmlTextWriter)

複合コントロールでは、子コントロールによるコンテンツのレンダリングに加え、RenderChildren メソッド呼び出しの前後で、複合コントロール自身のコンテンツをレンダリングすることもできます。コードの例を次に示します。

public class Composite : Control {
    ...
    protected override void Render(HtmlTextWriter writer) {
       writer.Write ("My child controls are rendered below.");
       RenderChildren(writer);
       writer.Write ("My child controls are rendered above.");
    }
}
[Visual Basic]
Public Class Composite
   Inherits Control
   ...
   Protected Overrides Sub Render(writer As HtmlTextWriter)
      writer.Write("My child controls are rendered below.")
      RenderChildren(writer)
      writer.Write("My child controls are rendered above.")
   End Sub
End Class

Control 基本クラスの Render の実装では、常に RenderChildren が呼び出されます。コントロールの子コントロールをレンダリングしない場合は、RenderChildren をオーバーライドして何も実行しないようにします。RenderChildren をオーバーライドするコードを次に示します。

protected override void RenderChildren(HtmlTextWriter writer) {
    // Do nothing so that child controls are not rendered.
}
[Visual Basic]
Protected Overrides Sub RenderChildren(writer As HtmlTextWriter)
    ' Do nothing so that child controls are not rendered.
End Sub

WebControl のレンダリング メソッド

Control 基本クラスのレンダリング メソッドのほかに、System.Web.UI.WebControls.WebControl クラスにもレンダリングを実行するメソッドがあります。

AddAttributesToRender メソッドを使用すると、WebControl から派生したコントロールで、追加の HTML 属性とカスケード スタイルシートのスタイルがレンダリングされるように指定できます。ボタン コントロールの属性を出力ストリームに書き込む方法を次の例に示します。この例では base.AddAttributestoRender を呼び出しているため、基本クラスによってレンダリングされる属性が保持されます。

protected override void AddAttributesToRender(HtmlTextWriter writer) {
    writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
    writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID);
    writer.AddAttribute(HtmlTextWriterAttribute.Value, Text);
    base.AddAttributesToRender(writer);
}
[Visual Basic]
Protected Overrides Sub AddAttributesToRender(writer As HtmlTextWriter)
    writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit")
    writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID)
    writer.AddAttribute(HtmlTextWriterAttribute.Value, [Text])
    MyBase.AddAttributesToRender(writer)
End Sub

WebControl から派生したコントロールでは、RenderBeginTag メソッドと RenderEndTag メソッドによって HTML 要素の開始タグと終了タグをオーバーライドできます。RenderContents メソッドを使用すると、タグ内のコンテンツをコントロールで指定できます。

メモ   Web サーバー コントロール (WebControl の派生クラス) の出力ストリームにテキストを書き込むには、Render メソッドを直接オーバーライドするのではなく、RenderContents メソッドをオーバーライドしてください。RenderContents をオーバーライドすると、WebControl に実装されているレンダリング機能 (属性出力など) を保持できます。詳細については、「サーバー コントロールのレンダリングのサンプル」を参照してください。

参照

コントロールの状態の維持 | サーバー コントロールのレンダリングのサンプル