首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET WebForm:<%= %> 與 <%# %> 差異深度解析

     編輯:ASP.NET 基礎

核心差異速查表

語法 用途 執行時機 資料繫結支援 典型場景
<%= %> 直接輸出變數/運算式值 頁面轉譯階段 不支援 顯示單一變數、屬性、方法回傳值
<%# %> 資料繫結運算式 呼叫 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(); // 必須呼叫
        }
    }

常見誤區與最佳實務

  1. 不要在資料控制項模板外使用 <%# %>:會拋出 InvalidOperationException,提示「資料繫結方法只能用於具有 DataBinding 事件的控制項」。
  2. 避免在 <%= %> 中放置複雜邏輯:建議移至 Code-behind 屬性或方法,保持標記簡潔。
  3. 雙向繫結請用 <%# Bind("Field") %>:僅適用於可編輯模板(如 EditItemTemplate),配合 FormView/DetailsView 自動更新資料源。
  4. 效能考量:<%# %> 涉及反射解析,大量資料時比 <%= %> 稍慢,但差異通常可忽略。

總結

<%= %> 是「輸出值」的簡寫;<%# %> 是「資料繫結」的宣告式語法,需配合 DataBind() 才生效。理解兩者生命週期差異,能避免 WebForm 開發中常見的「資料不顯示」或「例外錯誤」問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved