資料繫結運算式包含在 <%# 和 %> 分隔符號中,並且使用 Eval 和 Bind 函式。Eval 函式是用來定義單向 (唯讀) 繫結。Bind 函式是用在雙向 (可以更新的) 繫結。除了在資料繫結運算式中呼叫 Eval 和 Bind 方法以執行資料繫結以外,您也可以呼叫 <%# 和 %> 分隔符號中的任何公開範圍程式碼,在網頁處理期間執行程式碼和傳回值。
當呼叫控制項或 Page 類別的 DataBind 方法時,就會解析資料繫結運算式。針對像是 GridView、DetailsView 和 FormView 的控制項,在控制項的 PreRender 事件期間會自動解析資料繫結運算式,並且您不需要明確呼叫 DataBind 方法。
下列程式碼範例會示範在 ItemTemplate 中,搭配 FormView 控制項使用資料繫結運算式。
<asp:FormView ID="FormView1"
DataSourceID="SqlDataSource1"
DataKeyNames="ProductID"
RunAt="server">
<ItemTemplate>
<table>
<tr><td align="right"><b>Product ID:</b></td> <td><%# Eval("ProductID") %></td></tr>
<tr><td align="right"><b>Product Name:</b></td> <td><%# Eval("ProductName") %></td></tr>
<tr><td align="right"><b>Category ID:</b></td> <td><%# Eval("CategoryID") %></td></tr>
<tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
<tr><td align="right"><b>Unit Price:</b></td> <td><%# Eval("UnitPrice") %></td></tr>
</table>
</ItemTemplate>
</asp:FormView>
<asp:FormView ID="FormView1"
DataSourceID="SqlDataSource1"
DataKeyNames="ProductID"
RunAt="server">
<ItemTemplate>
<table>
<tr><td align="right"><b>Product ID:</b></td> <td><%# Eval("ProductID") %></td></tr>
<tr><td align="right"><b>Product Name:</b></td> <td><%# Eval("ProductName") %></td></tr>
<tr><td align="right"><b>Category ID:</b></td> <td><%# Eval("CategoryID") %></td></tr>
<tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
<tr><td align="right"><b>Unit Price:</b></td> <td><%# Eval("UnitPrice") %></td></tr>
</table>
</ItemTemplate>
</asp:FormView>
使用 Eval 方法
Eval 方法會評估資料繫結控制項範本 (例如 GridView、DetailsView 和 FormView 控制項) 中的晚期繫結資料運算式。在執行階段,Eval 方法會參考命名容器目前的資料項目,呼叫 DataBinder 物件的 Eval 方法。命名容器通常是包含整個記錄的資料繫結控制項的最小部分,例如 GridView 控制項中的資料列。因此您可以在資料繫結控制項範本內進行繫結時才使用 Eval 方法。
Eval 方法會以資料欄位的名稱做為參數,並且回傳包含資料來源的目前資料錄欄位值的字串。您可以提供選擇性的第二個參數以指定回傳字串的格式。字串格式參數會使用為 String 類別之 Format 方法定義的語法。
使用 Bind 方法
Bind 方法在某些地方相似於 Eval 方法,但是有一些顯著性的差異。雖然您可以像使用 Eval 方法一樣,使用 Bind 方法擷取資料繫結欄位的值,但是當資料可以修改時也會使用 Bind 方法。
在 ASP.NET 中,像是 GridView、DetailsView 和 FormView 的資料繫結控制項能夠自動使用資料來源控制項的更新、刪除和插入作業。例如,如果您已經為資料來源控制項定義 SQL Select、Insert、Delete 和 Update 陳述式,在 GridView、DetailsView 或 FormView 控制項範本中使用 Bind 會讓控制項能夠從範本的子控制項擷取值,並將其傳遞給資料來源控制項。然後資料來源控制項會執行適當的資料庫命令。因此,Bind 函式會在資料繫結控制項的 EditItemTemplate 或 InsertItemTemplate 中使用。
一般會搭配輸入控制項使用 Bind 方法,例如在編輯模式中 GridView 資料列呈現的 TextBox 控制項。當資料繫結控制項建立這些輸入控制項當做自己呈現的一部分時,就能夠擷取輸入值。
Bind 方法會以資料欄位名稱做為參數,與繫結的屬性產生關聯,如同下列範例所示:
安全性注意事項: |
|---|
這個範例有一個可接受使用者輸入的文字方塊,這可能會造成安全性威脅。ASP.NET Web 網頁預設會驗證使用者輸入,但不包含當中的指令碼或 HTML 項目。如需詳細資訊,請參閱指令碼攻擊概觀。 |
<EditItemTemplate>
<table>
<tr>
<td align=right>
<b>Employee ID:</b>
</td>
<td>
<%# Eval("EmployeeID") %>
</td>
</tr>
<tr>
<td align=right>
<b>First Name:</b>
</td>
<td>
<asp:TextBox ID="EditFirstNameTextBox" RunAt="Server"
Text='<%# Bind("FirstName") %>' />
</td>
</tr>
<tr>
<td align=right>
<b>Last Name:</b>
</td>
<td>
<asp:TextBox ID="EditLastNameTextBox" RunAt="Server"
Text='<%# Bind("LastName") %>' />
</td>
</tr>
<tr>
<td colspan="2">
<asp:LinkButton ID="UpdateButton" RunAt="server"
Text="Update" CommandName="Update" />
<asp:LinkButton ID="CancelUpdateButton" RunAt="server"
Text="Cancel" CommandName="Cancel" />
</td>
</tr>
</table>
</EditItemTemplate>當按下資料列的 Update 按鈕時,就會擷取每個使用 Bind 繫結之控制項屬性的值,然後傳遞給更新作業的資料來源控制項。