| 語法 | 用途 | 執行時機 | 資料繫結支援 | 典型場景 |
|---|---|---|---|---|
<%= %> |
直接輸出變數/運算式值 | 頁面轉譯階段 | 不支援 | 顯示單一變數、屬性、方法回傳值 |
<%# %> |
資料繫結運算式 | 呼叫 DataBind() 時 |
完整支援 | Repeater、GridView、ListView 等資料控制項模板 |
<%= %> - 等同 Response.Write()DataBind(),頁面生命週期 Render 階段自動執行。Container.DataItem)。<span>目前時間:<%= DateTime.Now.ToString("yyyy-MM-dd HH:mm") %></span>
<span>使用者:<%= CurrentUser.Name %></span>
<%# %> - 專屬資料繫結語法ItemTemplate、EditItemTemplate 等)。DataBind() 才會解析執行。Eval("FieldName")、Bind("FieldName") 存取資料項欄位。<asp:Repeater ID="rptUsers" runat="server">
<ItemTemplate>
<div><%# Eval("UserName") %> - <%# Eval("Email") %></div>
</ItemTemplate>
</asp:Repeater>
// Code-behind
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
rptUsers.DataSource = GetUsers();
rptUsers.DataBind(); // 必須呼叫
}
}
<%# %>:會拋出 InvalidOperationException,提示「資料繫結方法只能用於具有 DataBinding 事件的控制項」。<%= %> 中放置複雜邏輯:建議移至 Code-behind 屬性或方法,保持標記簡潔。<%# Bind("Field") %>:僅適用於可編輯模板(如 EditItemTemplate),配合 FormView/DetailsView 自動更新資料源。<%# %> 涉及反射解析,大量資料時比 <%= %> 稍慢,但差異通常可忽略。<%= %> 是「輸出值」的簡寫;<%# %> 是「資料繫結」的宣告式語法,需配合 DataBind() 才生效。理解兩者生命週期差異,能避免 WebForm 開發中常見的「資料不顯示」或「例外錯誤」問題。