呈現 ASP.NET 伺服器控制項
呈現表示建立顯示介面上的視覺表示的程序。而在 Web 要求的情況下,實際的呈現作業將由用戶端的 Web 瀏覽器或其他的檢視裝置來執行。ASP.NET 網頁架構的工作是傳送 HTML (或以 XML 或 WML 之類的其他標記語言表示的文字) 以回應 Web 要求。網頁 (及它的子控制項) 的工作則是將標記內容撰寫成輸出資料流。因此,基底類別 System.Web.UI.Control 提供了 Render 方法,它具有下列的簽名碼 (Signature)。
protected virtual void Render(HtmlTextWriter writer);
[Visual Basic]
Overridable Protected Sub Render(ByVal writer As HtmlTextWriter)
System.Web.UI.HtmlTextWriter 類別會封裝輸出資料流以撰寫標記內容。在最簡單的情形下,控制項作者可以覆寫 Render,將 HTML (或其他的標記內容) 作為字串引數傳遞給 HtmlTextWriter 其執行個體 (Instance) 的 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 版本間在上下層呈現上的自動轉換。
對 HtmlTextWriter.Write 執行多個呼叫會比串連字串並以單一字串引數傳遞給 Write 方法來得更有效率。
注意 為簡化起見,說明文件中的數個範例會直接將文字字串傳遞給 HtmlTextWriter.Write。然而,在您的控制項中,您應該使用 HtmlTextWriter 的公用程式方法。
基底 Control 類別提供了 RenderChildren 方法,以呈現它的子控制項 (如存在) 的內容。
protected virtual void RenderChildren(HtmlTextWriter writer);
[Visual Basic]
Overridable Protected Sub RenderChildren(ByVal writer As HtmlTextWriter)
複合控制項 (Composite Control) 除了由它的子控制項呈現內容外,它也可以在叫用 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 實作 (Implementation) 永遠會叫用 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 的呼叫,它可以保留由基底類別 (Base Class) 所呈現的屬性。
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
RenderBeginTag 和 RenderEndTag 方法使衍生自 WebControl 的控制項可以覆寫開頭和結尾 HTML 項目標記。RenderContents 方法則使控制項可以指定標記內的內容。
注意 若要將文字寫入 Web 伺服器控制項 (衍生自 WebControl 的類別) 的輸出資料流,您應該覆寫 RenderContents 方法,而不是直接覆寫 Render 方法。如此才可以保留由 WebControl (例如發出屬性) 實作的呈現功能。如需詳細的資訊,請參閱呈現伺服器控制項範例。