ASP.NET 框架在要求 Web 控件儲存資料至 ViewState 時,會自動呼叫 SaveViewState 方法;反之從 ViewState 載入資料時,則呼叫 LoadViewState。能夠保存在 ViewState 中的物件,必須支援二進位序列化。這正是 SkyTreeNode 與 SkyTreeNodeList 類別前標註 [System.Serializable()] 屬性的原因。
SkyTreeViewControl 原始碼結構相對複雜,開發者需具備以下知識體系:
XML 資料島(<xml> 標籤)是微軟對 HTML 標準的擴展,僅 IE 支援。若需相容 Firefox 等非 IE 瀏覽器,可改用 XMLHttpRequest ActiveX 元件從伺服器下載 XML 文件。本控件刻意示範 XML 資料島用法,優點在於可將 XML 文件內嵌於 HTML 文件中,減少部署檔案數量、降低系統複雜度。若專案明確限定客戶端為 IE 環境,採用 XML 資料島是合理選擇。
此 Web 控件的關鍵資源文件為 SkyTreeViewControl.xslt,編譯時需設定為「嵌入的資源」。其主體結構如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="https://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- 文件說明與版權資訊 -->
<xsl:output method="html" indent="no" />
<!-- ***************** 主模板:XSLT 轉換入口 ******************** -->
<xsl:template match="/*">
... 主模板內容 ...
</xsl:template>
<!-- ******************* 輸出單一樹狀節點 *************************** -->
<xsl:template name="TreeNode">
... 子模板內容 ...
</xsl:template>
</xsl:stylesheet>
<xsl:output method="html" indent="no" /> 指令宣告輸出為 HTML 格式且不縮排,減小輸出體積。
主模板為 XSLT 轉換進入點,核心邏輯:
NodeID 變數,依優先序取值:@RootID → @ID → generate-id(.)。<table> 容器,ID 為 {$NodeID}_table。<xsl:for-each select="Node">),對每個節點呼叫 TreeNode 子模板,傳遞 Level=1 參數,啟動遞迴生成 HTML 元素流程。此設計奠定了整棵樹狀結構在 XSLT 層面的遞迴渲染基礎。