.aspx 頁面是宣告式文字檔,包含靜態內容(HTML)與伺服器端程式碼標記。執行時由 ASP.NET 執行階段剖析、編譯為 Page 衍生類別,動態產生輸出。
| 標記 | 名稱 | 用途 | 範例 |
|---|---|---|---|
<%@ ... %> | 指令 | 頁面層級設定:語言、繼承、匯入、輸出快取、事件驗證等 | <%@ Page Language="C#" MasterPageFile="~/Site.Master" %> |
<% ... %> | 程式碼呈現區塊 | 執行陳述式、控制流程、輸出 HTML 片段 | <% for (int i=0; i<3; i++) { %> <p>項目 <%=i%></p> <% } %> |
<%= ... %> | 運算式呈現區塊 | 計算運算式並輸出結果(等同 Response.Write) | <%=DateTime.Now.ToString("yyyy/MM/dd")%> |
<%# ... %> | 資料繫結運算式 | 單向/雙向資料繫結,於 DataBind() 時評估 | <asp:Label Text='<# Eval("Name") %>' runat="server" /> |
<%$ ... %> | 運算式建構器 | 從組態、資源、連線字串取值 | <%$ ConnectionStrings:Northwind %> |
<%-- ... --%> | 伺服器端註解 | 不會輸出至瀏覽器,僅原始碼可見 | <%-- 這行不會輸出 --%> |
<script runat="server"> | 程式碼宣告區塊 | 定義成員變數、方法、事件處理常式,編譯進 Page 類別 | 見下方範例 |
<asp:Control ... /> | 伺服器控制項標記 | 宣告式建立控制項樹,runat="server" 必備 | <asp:Button ID="btn" Text="送出" OnClick="btn_Click" runat="server" /> |
<%@ Page Language="C#" %>
<html><body>
<%
// 程式碼呈現:可包含多行陳述式、控制結構
string[] names = { "Alice", "Bob", "Charlie" };
foreach (string n in names)
{
%>
<div>Hello, <%= n %>!</div> <%-- 運算式呈現:輸出變數值 --%>
<%
}
%>
</body></html>
注意:C# 陳述式需分號結尾;<%= ... %> 內不加分號,否則會產生 Response.Write(...;); 語法錯誤。
<script runat="server">
// 成員變數
private int _counter = 0;
// 事件處理常式
protected void btn_Click(object sender, EventArgs e)
{
_counter++;
lblCount.Text = "點擊次數:" + _counter;
}
// 輔助方法
protected string FormatName(string first, string last)
{
return last + " " + first;
}
</script>
<html><body>
<form runat="server">
<asp:Label ID="lblCount" runat="server" Text="0" />
<asp:Button ID="btn" Text="點我" OnClick="btn_Click" runat="server" />
</form>
</body></html>
關鍵差異:ASP 時代函數寫在 <% %>;ASP.NET 所有成員必須在 <script runat="server"> 定義,否則編譯錯誤。
| 指令 | 常用屬性 | 說明 |
|---|---|---|
@ Page | Language, MasterPageFile, CodeFile, Inherits, EnableViewState, ValidateRequest, AsyncTimeout | 頁面層級設定,每頁僅一個 |
@ Import | Namespace | 匯入命名空間,等同 C# using |
@ Register | TagPrefix, Namespace, Assembly, Src, TagName | 註冊使用者控制項、自訂控制項 |
@ OutputCache | Duration, VaryByParam, Location, SqlDependency | 頁面/片段輸出快取 |
@ Reference | VirtualPath | 強制編譯參考頁面/控制項 |
@ PreviousPageType | VirtualPath, TagName | 跨頁面回傳強型別存取前一頁 |
| 模式 | 檔案結構 | 優點 | 缺點 |
|---|---|---|---|
| 內聯 | 單一 .aspx 含 <script runat="server"> | 單一檔案、快速原型、部署簡單 | 程式碼與標記混雜、難以團隊協作、無編譯時型別檢查(舊版) |
| 後置程式碼 | .aspx + .aspx.cs (partial class) | 關注點分離、設計師/開發者並行、完整編譯檢查、版控友善 | 兩個檔案、需同步類別名稱 |
ASP.NET 2.0 採用 partial class 機制,.aspx.cs 只需定義事件處理常式,控制項變數自動由 .aspx 設計器產生於 .aspx.designer.cs,極大簡化維護。
<% %> 區塊,改用資料繫結運算式 <%# %> 或控制項屬性繫結。<%$ %> 存取組態/資源,避免硬編碼。ValidateRequest="true"(預設)防止 XSS,必要時在控制項層級關閉 ValidateRequestMode="Disabled"。@ OutputCache 提升效能,動態區塊用 <asp:Substitution>。掌握 ASP.NET Web Form 八大語法標記、程式碼渲染模型、內聯與後置程式碼差異,是開發高品質 ASP.NET 應用的基礎。正確選擇語法元素、遵循最佳實務,能讓頁面結構清晰、易維護、效能優異。