控件渲染品質直接決定 HTML 輸出的標準度、可維護性與前端整合體驗。本文總結四大渲染最佳實踐。
不推薦:字串拼接 writer.Write("<select><option>...</select>") — 易出錯、無智慧提示、難維護。
推薦:流式 API:
writer.RenderBeginTag(HtmlTextWriterTag.Select);
writer.AddAttribute(HtmlTextWriterAttribute.Value, "0");
writer.RenderBeginTag(HtmlTextWriterTag.Option);
writer.Write("ASP.NET");
writer.RenderEndTag(); // </option>
writer.AddAttribute(HtmlTextWriterAttribute.Value, "1");
writer.RenderBeginTag(HtmlTextWriterTag.Option);
writer.Write("ASP.NET AJAX");
writer.RenderEndTag();
writer.RenderEndTag(); // </select>
HtmlTextWriterTag / HtmlTextWriterAttribute / HtmlTextWriterStyle 列舉涵蓋所有標準 HTML 標籤/屬性/樣式。checked)、樣式字串組合。複雜控件渲染邏輯拆解為多個 RenderXxx 方法:
protected override void Render(HtmlTextWriter writer)
{
RenderTable(writer);
}
private void RenderTable(HtmlTextWriter writer)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "0");
writer.RenderBeginTag(HtmlTextWriterTag.Table);
RenderPaymentMethod(writer);
RenderCreditCardNo(writer);
RenderCardholderName(writer);
RenderExpirationDate(writer);
RenderSubmitButton(writer);
writer.RenderEndTag();
}
// 父標籤
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.UniqueID);
writer.RenderBeginTag(HtmlTextWriterTag.Select);
// 子標籤:父 ID + "_" + 語意後綴
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.UniqueID + "_optAsp");
writer.RenderBeginTag(HtmlTextWriterTag.Option);
ctl00_ContentPlaceHolder1_MyControl_optAsp)。
3. 支援 ClientIDMode="Predictable/AutoID/Static" (ASP.NET 4.0+) 進一步控制。
string text = this.Text;
if (!string.IsNullOrEmpty(text))
{
writer.AddAttribute(HtmlTextWriterAttribute.Value, text);
}
// 若 text 為空,完全不輸出 value 屬性,而非 value=""
if (this.BorderWidth.IsEmpty) writer.AddStyleAttribute(...) 等同邏輯。protected override void Render(HtmlTextWriter writer)
{
RenderInput(writer);
}
private void RenderInput(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
writer.AddAttribute(HtmlTextWriterAttribute.Name, UniqueID);
string val = Text;
if (!string.IsNullOrEmpty(val)) writer.AddAttribute(HtmlTextWriterAttribute.Value, val);
if (!Enabled) writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");
writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClass);
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
}
遵循這四大原則,你的控件輸出將符合標準、易於除錯、前端友善,並具備良好的擴充性。