首次造訪 ASP.NET 頁面時,系統會將 .aspx 編譯為動態類別,存放於 Temporary ASP.NET Files 目錄。本文以簡單頁面為例,完整追蹤從標記到動態類別結構的生成過程,揭示控件樹建構與渲染機制。
<%@ Page Language="C#" %>
<html xmlns="https://www.w3.org/1999/xhtml">
<head runat="server"><title>標題頁</title></head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" />
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>ListItem1</asp:ListItem>
<asp:ListItem>ListItem2</asp:ListItem>
</asp:DropDownList>
</div>
<asp:Button ID="Button1" runat="server" Text="Button" />
</form>
</body>
</html>
編譯生成類別 ASP.default_aspx : Page,核心方法:
FrameworkInitialize():建構控件樹 (@__BuildControlTree)。@__BuildControlTree():以 IParserAccessor.AddParsedSubObject 逐層加入靜態字面內容與控件實例。@__BuildControlTextBox1()、@__BuildControlDropDownList1() 等,設定屬性、事件繫結。Page (default_aspx)
└── HtmlForm (form1)
└── LiteralControl (靜態 HTML: div 等)
├── TextBox (TextBox1)
├── DropDownList (DropDownList1)
│ ├── ListItem (ListItem1)
│ └── ListItem (ListItem2)
└── Button (Button1)
partial class 實現分離。LiteralControl 節點,保留原始輸出順序。FrameworkInitialize 階段一次性建構完整樹狀結構,後續生命週期直接操作實例。runat="server" 的表單與控件賦予 UniqueID,確保回發識別唯一性。%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\專案名\隨機碼\隨機碼\%USERPROFILE%\AppData\Local\Temp\Temporary ASP.NET Files\專案名\隨機碼\隨機碼\aspnet_compiler)。Page.ParserAccessor 介面揭示了標記解析的擴充點,進階控件開發可介入解析流程。ASP.NET 頁面非單純模板引擎,而是編譯為強型別類別、建構完整控件物件樹、經生命週期事件驅動渲染的執行模型。掌握此過程,能從根本上理解 ViewState、事件回發、動態控件等進階主題。