開發自訂控制項時,設計介面常出現「呈現控件時出錯:未將物件參考設定為物件的實例」,但編譯與執行皆正常。本文分析設計時、編譯時、執行時差異,並提供修正範例。
設計時 VS 呼叫 Render/RenderContents,若程式碼存取未初始化的物件(如 Page.Server、子控制項),即拋出 NullReferenceException。
protected override void RenderContents(HtmlTextWriter writer)
{
UpButton.Text = Page.Server.HtmlDecode(UpButton.Text); // 設計時 Page 為 null
DownButton.Text = Page.Server.HtmlDecode(DownButton.Text);
base.RenderContents(writer);
}
欄位初始化:
private string upButtonText = "∧";
private string downButtonText = "∨";
if (DesignMode || Page == null) return;EnsureChildControls 或 OnPreRender 設定屬性。DesignMode 屬性區分環境。protected override void RenderContents(HtmlTextWriter writer)
{
if (DesignMode) { base.RenderContents(writer); return; }
UpButton.Text = Page.Server.HtmlDecode(UpButton.Text);
DownButton.Text = Page.Server.HtmlDecode(DownButton.Text);
base.RenderContents(writer);
}
設計時錯誤源於模擬環境缺少執行期上下文。養成 DesignMode 判斷與延遲初始化習慣,可徹底消除此類干擾。