當 GenerateAtServer=true 時,控件在伺服器端完成 HTML 生成。核心流程:
ReadXSLTString() 從嵌入資源載入 XSLT 模板字串,載入為 XmlDocument。XmlDocument(NodeXmlDocument)。XslCompiledTransform 轉換引擎,載入 XSLT 模板。Transform(),結果輸出至 StringWriter。RenderContent 的 writer 參數直接寫入回應流。若非伺服器端生成 HTML,則改為客戶端動態生成。控件輸出三段關鍵內容:
writer.Write("<span id='" + this.ClientID + "_container'>正在載入,請稍候<img src='...' /></span>");
writer.Write("<xml id='" + this.ClientID + "_xml'>" + xml + "</xml>");
this.Page.ClientScript.RegisterStartupScript(
this.GetType(),
"SkyTreeViewControl_Init_" + this.ClientID,
@"<script language=JavaScript>
RefreshSkyTreeViewControl('" + this.ClientID + @"');
</script>"
);
頁面載入時立即呼叫 RefreshSkyTreeViewControl 初始化樹狀列表。
控件將節點集合 myNodes 保存在 ViewState 中,實現跨回發保持狀態:
protected override object SaveViewState() {
this.ViewState["nodes"] = this.myNodes;
return base.SaveViewState();
}
protected override void LoadViewState(object savedState) {
myNodes = this.ViewState["nodes"] as SkyTreeNodeList;
base.LoadViewState(savedState);
}
此機制確保樹狀結構在 PostBack 後仍能維持展開/摺疊狀態與節點資料。