ASP.NET架構中的資料繫結概要與資料繫結運算式的使用_實用技巧

來源:互聯網
上載者:User

<%# %> 文法

ASP.NET 介紹了一種新的聲明性文法 <%# %>。該文法是在 .aspx 頁中使用資料繫結的基礎。所有資料繫結運算式都必須包含在這些字元中。下面的列表包含從多個源進行簡單資料繫結的樣本:
簡單屬性(用於客戶的文法):

<%# custID %>

集合(用於訂單的文法):

<asp:ListBox id="List1" datasource='<%# myArray %>' runat="server">

 運算式(用於連絡人的文法):

<%# ( customer.First Name + " " + customer.LastName ) %>

     
方法結果(用於未結清餘額的文法):

<%# GetBalance(custID) %>

     
在前面的樣本中,<%# %> 內聯標記用於指示將把特定資料來源中的資訊放在 .aspx 頁中的什麼位置。以下資料繫結樣本使用 TextBox Web 伺服器控制項:

<asp:textbox id=txt text="<%# custID %>" runat=server />


Page.DataBind() versus Control.DataBind()

確定特定資料來源並設定 .aspx 頁上的對象之後,您必須將資料繫結到資料來源。您可以使用 Page.DataBind 或 Control.DataBind 方法將資料繫結到資料來源。

這兩種方法的使用方式很相似。主要差別在於:調用 Page.DataBind 方法後,所有資料來源都將綁定到它們的伺服器控制項。在顯式調用 Web 伺服器控制項的 DataBind 方法或在調用頁面級的 Page.DataBind 方法之前,不會有任何資料呈現給控制項。通常,可以從 Page_Load 事件調用 Page.DataBind(或 DataBind)。

資料繫結運算式深入
資料繫結運算式包含在 <%# 和 %> 分隔字元之內,並使用 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 控制項所做的更新。

使用對尋找表的綁定
一種有關資料繫結控制項的常見方案是允許使用者使用 DropDownList 控制項或其他清單控制項從尋找表中選擇一個值,以更新或插入該值。在這種情況下,將該尋找控制項綁定到返回可能值列表的單獨資料來源,而將該尋找控制項的選定值綁定到父資料繫結行中的欄位。
可以按照如下方法添加此功能。首先,對於尋找控制項,向資料繫結控制項(例如 GridView、DetailsView 或 FormView 控制項)中的模板添加一個清單控制項(DropDownList 或 ListBox 控制項)。接著將尋找控制項的 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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.