資料繫結運算式概觀
更新:2007 年 11 月
資料繫結語法可以讓您將控制項屬性值繫結至資料,並且指定擷取、更新、刪除和插入資料的值。
資料繫結語法
資料繫結運算式包含在 <%# 和 %> 分隔符號中,並且使用 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 繫結之控制項屬性的值,然後傳遞給更新作業的資料來源控制項。
明確呼叫 DataBind 方法
像是 GridView、FormView 和 DetailsView 的控制項,當使用 DataSourceID 屬性將其繫結至資料來源控制項時,會藉由隱含地呼叫 DataBind 方法執行繫結。然而,在有些情形中您需要明確呼叫 DataBind 方法。
其中一種情形是如果您使用 DataSource 屬性,而不是 DataSourceID 屬性將控制項繫結至資料來源控制項。在這種情況下,您需要明確呼叫 DataBind 方法執行資料繫結和解析資料繫結運算式。
另一種情形是如果您需要手動重新整理資料繫結控制項中的資料。假設,在一個網頁上,有兩個顯示來自相同資料庫的資訊的控制項 (可能使用不同的檢視)。在這種情況下,您需要明確將控制項重新繫結至資料以便保持資料顯示的同步。例如,可能有顯示產品清單的 GridView 控制項,以及允許使用者編輯個別產品的 DetailsView 控制項。雖然 GridView 和 DetailsView 控制項顯示相同來源的資料,但是因為其使用不同的查詢取得資料,所以是繫結至不同的資料來源控制項。使用者可能會使用 DetailsView 控制項更新記錄,導致關聯的資料來源控制項執行更新。然而,因為 GridView 控制項繫結至不同的資料來源控制項,所以在重新整理網頁之前都會顯示舊的記錄值。因此,在 DetailsView 控制項更新資料後,您可以呼叫 DataBind 方法。這也會導致 GridView 控制項藉由重新執行 <%# 和 %> 分隔符號中的任何資料繫結運算式以及公開範圍程式碼,以便更新其檢視。因此,GridView 控制項會反映 DetailsView 控制項所做的更新。
使用查閱資料表的繫結
常見的資料繫結控制項案例,是讓使用者藉由使用 DropDownList 控制項或其他清單控制項,從查閱資料表 (Lookup Table) 中選取值,以便可以更新或插入值。在這種狀況下,查閱控制項是繫結至可傳回可能值清單的個別資料來源,而查閱控制項的選取值則是繫結至父資料繫結資料列中的欄位。
您可以加入這個功能,如下所示:首先,針對查閱控制項,您可以將清單控制項 (DropDownList 或 ListBox 控制項) 加入至資料繫結控制項 (例如 GridView、DetailsView 或 FormView 控制項) 中的樣板。接著,把查閱控制項的 SelectedValue 屬性繫結至容器控制項的資料來源中的相關欄位。然後,把查閱控制項的 DataSourceID 屬性設為可擷取查閱值的資料來源控制項。如果可以的話,把查閱控制項的 DataTextField 屬性設為當中含有要顯示之值的查閱資料表欄位,並將其 DataValueField 屬性設為當中含有查閱值之唯一識別項的查閱資料表欄位。
下列程式碼範例示範的是 DropDownList 控制項,它包含在 FormView 控制項的 InsertItemTemplate 樣板 (這也可以是包含在 DetailsView 控制項之 Fields 屬性或 GridView 控制項之 Columns 屬性中的 TemplateField 的 InsertItemTemplate 樣板)。DropDownList 控制項的 SelectedValue 屬性會使用 Bind 方法的兩種繫結方式,對 FormView 控制項之目前資料列的 CategoryID 欄位進行繫結。DropDownList 控制項的 DataSourceID 屬性是設為可擷取可能分類之名稱和 ID 清單的個別資料來源控制項。DropDownList 控制項的 DataTextField 屬性是設為查閱資料來源中的 CategoryName 欄位,這樣才可以顯示可能分類之名稱清單。DropDownList 控制項的 DataValueField 屬性是設為相關分類名稱之查閱資料來源中的 CategoryID 欄位。當使用者選取清單中的分類名稱時,便會將 DropDownList 控制項的 SelectedValue 屬性設為所選分類名稱的分類 ID。
<tr>
<td align="right"><b>Category:</b></td>
<td><asp:DropDownList ID="InsertCategoryDropDownList"
SelectedValue='<%# Bind("CategoryID") %>'
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName"
DataValueField="CategoryID"
RunAt="Server" />
</td>
</tr>
<tr>
<td align="right"><b>Category:</b></td>
<td><asp:DropDownList ID="InsertCategoryDropDownList"
SelectedValue='<%# Bind("CategoryID") %>'
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName"
DataValueField="CategoryID"
RunAt="Server" />
</td>
</tr>
同一個清單控制項也可以一併在編輯項目樣板中使用。