資料繫結文法
資料繫結運算式包含在 <%# 和 %> 分隔字元之內,並使用 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>
使用 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 方法,就可以使控制項從模板中的子控制項中提取值,並將這些值傳遞給資料來源控制項。然後資料來源控制項將執行適當的資料庫命令。出於這個原因,在資料繫結控制項的 EditItemTemplate 或 InsertItemTemplate 中要使用 Bind 函數。
Bind 方法通常與輸入控制項一起使用,例如由編輯模式中的 GridView 行所呈現的 TextBox 控制項。當資料繫結控制項將這些輸入控制項作為自身呈現的一部分建立時,該方法便可提取輸入值。
Bind 方法採用資料欄位的名稱作為參數,從而與綁定屬性關聯,如下面的樣本所示:
<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 文法綁定的每個控制項屬性值都會被提取出來,並傳遞給資料來源控制項以執行更新操作。
顯式調用 DataBind 方法
有些控制項,如 GridView、FormView 和 DetailsView 控制項,當它們通過 DataSourceID 屬性綁定到資料來源控制項時,會通過隱式調用 DataBind 方法來執行綁定。但是,有些情況需要通過顯式調用 DataBind 方法來執行綁定。
其中一種情況就是使用 DataSource 屬性(而非 DataSourceID 屬性)將某個控制項綁定到資料來源控制項時。在這種情況下,需要顯式調用 DataBind 方法,從而執行資料繫結和解析資料繫結運算式。
另一種情況就是需要手動重新整理資料繫結控制項中的資料時。假設有這樣一個頁面,其中有兩個控制項,這兩個控制項都顯示來自同一資料庫的資訊(可能使用不同的視圖)。在這種情況下,可能需要顯式地將控制項重新綁定到資料,以保持資料顯示的同步。例如,可能有一個顯示產品列表的 GridView 控制項,和一個允許使用者編輯單個產品的 DetailsView 控制項。雖然 GridView 和 DetailsView 控制項所顯示的資料都來自同一資料來源,但被綁定到不同的資料來源控制項,因為這兩個控制項使用不同的查詢來擷取其資料。使用者可能會使用 DetailsView 控制項更新記錄,從而引發由關聯的資料來源控制項執行更新。但是,由於 GridView 控制項被綁定到不同的資料來源控制項,所以,該控制項仍將顯示舊的記錄值,直至頁面被重新整理時才會更新。因此,在 DetailsView 控制項更新資料後,可以調用 DataBind 方法。這會使 GridView 控制項更新其視圖,並重新執行任何資料繫結運算式以及 <%# 和 %> 分隔字元之內的公用範圍代碼。這樣一來,GridView 控制項將會反映 DetailsView 控制項所做的更新。