Eval(單向綁定)與 Bind(雙向綁定)是 ASP.NET 資料綁定語法的核心,正確選擇直接影響資料回寫成敗。
| 特性 | Eval (單向) | Bind (雙向) |
|---|---|---|
| 方向 | 資料源 → 介面 | 資料源 ↔ 介面 |
| 原理 | 反射讀取屬性 | 反射讀取 + 解析賦值語句 |
| 適用場景 | 唯讀顯示、Label、Literal、GridView 唯讀欄 | 可編輯欄位、TextBox、DropDownList、CheckBox、GridView/DetailsView/FormView 編輯/插入模板 |
| 語法 | <%# Eval("Field") %> | <%# Bind("Field") %> |
| 格式化 | <%# Eval("Date", "{0:yyyy-MM-dd}") %> | <%# Bind("Date", "{0:yyyy-MM-dd}") %> |
| 導航 URL | <%# Eval("Id", "Detail.aspx?id={0}") %> | 不支援複雜格式字串 |
<!-- 一般綁定 -->
<%# Eval("ProductName") %>
<!-- 日期格式化 -->
<%# Eval("CreateDate", "{0:yyyy-MM-dd HH:mm}") %>
<!-- 超鏈接構建 -->
<a href='<%# Eval("Id", "ProductDetail.aspx?id={0}") %>'>詳情</a>
<!-- 多欄位組合 -->
<%# string.Format("{0} - {1}", Eval("FirstName"), Eval("LastName")) %>
<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" OnRowUpdating="gv_RowUpdating">
<Columns>
<asp:TemplateField HeaderText="產品">
<ItemTemplate><%# Eval("Name") %></ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtName" runat="server" Text='<%# Bind("Name") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="價格">
<ItemTemplate><%# Eval("Price", "{0:C}") %></ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtPrice" runat="server" Text='<%# Bind("Price", "{0:F2}") %>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" />
</Columns>
</asp:GridView>
編輯模式下,點擊「更新」時,GridView 會自動解析所有 Bind 表達式,將控件值回寫至資料源物件對應屬性,再觸發 RowUpdating 事件。
{0:format} 簡單格式。若需在唯讀模式下顯示格式化,但在編輯模式下輸入原始值,可在 EditItemTemplate 用 Bind,ItemTemplate 用 Eval 搭配格式化。
「只看不改用 Eval,要改回寫用 Bind;格式化雙方都支援,複雜導航 Eval 專用。」
熟練掌握兩者差異,是 ASP.NET WebForms 高效開發資料驅動頁面的關鍵。