某些靜態化輸出、靜態頁生成、或對接不支援 ViewState 的舊系統時,需要在渲染階段徹底剔除 __VIEWSTATE 與 __EVENTVALIDATION 隱藏字段,並移除 <form runat="server"> 標籤,輸出純淨 HTML。
protected override void Render(HtmlTextWriter writer)
{
using (var html = new System.IO.StringWriter())
using (var tw = new HtmlTextWriter(html))
{
base.Render(tw); // 先讓基類渲染完整頁面
string output = html.ToString();
// 1. 移除 <form runat="server"> 標籤對
int formStart = output.IndexOf("<form");
if (formStart > 0)
{
int formEnd = output.IndexOf(">", formStart);
string beforeForm = output.Substring(0, formStart);
string afterForm = output.Substring(formEnd + 1);
output = beforeForm + afterForm;
}
// 2. 移除 __VIEWSTATE
int vsIndex = output.IndexOf("<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\"");
if (vsIndex > 0)
{
int vsEnd = output.IndexOf(">", vsIndex);
output = output.Substring(0, vsIndex) + output.Substring(vsEnd + 1);
}
// 3. 移除 __EVENTVALIDATION
int evIndex = output.IndexOf("<input type=\"hidden\" name=\"__EVENTVALIDATION\" id=\"__EVENTVALIDATION\"");
if (evIndex > 0)
{
int evEnd = output.IndexOf(">", evIndex);
output = output.Substring(0, evIndex) + output.Substring(evEnd + 1);
}
// 4. 清理殘留 </form> 與換行
output = output.Replace("</form>", "").Replace("\r\n", "");
writer.Write(output);
}
}
| 方案 | 優點 | 缺點 |
|---|---|---|
頁面指令 EnableViewState="false" | 簡單、標準 | 僅禁用控件級 ViewState,頁面級隱藏字段仍存在 |
ViewStateMode="Disabled" (ASP.NET 4.0+) | 更細粒度控制 | 同樣保留 __VIEWSTATE 隱藏字段(空值) |
| ControlAdapter 適配器 | 架構乾淨、可複用 | 配置較繁瑣,需 .browser 文件 |
| 重寫 Render(本文方案) | 徹底移除、無需配置 | 破壞 PostBack 機制,需謹慎使用 |