asp.net引入了一種新的聲明數據綁定的語法。這種極其靈活的語法允許開發者不僅綁定數據源,而且可以綁定簡單的屬性、集合、表達式、甚至是調用方法所返回的結果。下面的列表顯示了這種新語法的一些例子:
簡單屬性
customer: <%# custid %>
集合
orders: <asp:listbox id="list1" datasource='<%#
myarray %>' runat="server">
表達式
contact: <%# ( customer.first name + " " + customer.lastname
) %>
方法結果
outstanding balance: <%# getbalance(custid) %>
盡管這種語法看上去和asp中response.write的簡寫方式<%= %>很類似,但他們的運行機理卻大不相同。response.write的簡寫語法在頁面處理的時候求值,而asp.net數據綁定語法只有當調用databind方法的時候才求值。
databind是page和所有服務器控件的一個方法。當你對一個父控件調用databind方法的時候,他所包含的子控件都會調用databind方法。比如執行datalist1.databind(),datalist模板中的所有控件都引用了databind方法。在page調用databind方法--- page.databind()或者簡單的databind() ---導致頁面上所有的數據綁定表達式都會被求值。databind經常在page_load事件中被調用,比如下面的例子:
protected void page_load(object src, eventargs e) {
databind();
}
你幾乎可以在.aspx頁面中聲明部分的任何地方使用數據綁定表達式,在運行時提供它所計算的預期的數據類型。當求值以后,簡單的屬性、表達式以及上例中的方法,將向用戶顯示文本。在這些情況下,數據綁定表達式必須求出一個string類型的值。在集合的例子中,數據綁定表達式所求值的類型,對于listbox的datasource 屬性來說是有效的。你會發現,在數據綁定表達式中為了得到期望的結果,強制轉換結果值的類型,是很有必要的。例如,如果count是一個整數:
number of records: <%# count.tostring() %>
綁定簡單屬性
asp.net數據綁定語法支持綁定頁面的公共變量和屬性,以及頁面上其他控件的屬性。
下面的例子說明了綁定到頁面的公共變量和簡單屬性。注意這些值在調用databind()之前已被初始化。
綁定集合和列表
列表服務器控件,如datagrid、 listbox 和 htmlselect,使用集合作為數據源。下面的例子說明綁定到常用的clr 集合類型。這些控件只能綁定到支持ienumerable, icollection, 或 ilistsource 接口的集合。通常,您可以綁定到arraylist、 hashtable、 dataview 和datareader.
很多時候,在綁定到頁面或控制之前,你可能會操作這些數據。
databinder.eval方法
asp.net框架提供了一個靜態方法databinder.eval,可以計算后期數據綁定表達式的值,并可以將結果任意格式化為字符串。databinder.eval是很方便的,他排除了許多開發人員必須作的(通過強制改變值的類型來得到預期的數據類型)顯式轉換。尤其是在帶有模板列表的數據綁定控件中,因為經常需要顯式轉換數據行和數據字段,所以它特別有用。
仔細看下面的代碼,整數將被顯示為貨幣型字符串。使用標準的asp.net數據綁定語法,為了得到數據字段integervalue,你必須首先顯式轉換數據行的類型,然后作為string.format方法的參數才能得到結果
<%# string.format("{0:c}", ((datarowview)container.dataitem)["integervalue"]) %>
這樣的語法實在錯綜復雜的難以記憶。比較而言,databinder.eval 就很簡單了。它帶有三個參數:數據項的命名容器、數據字段名稱和格式化字符串。 在模板列表如datalist、datagrid、或 repeater,命名容器總是container.dataitem。 page 是另一個可以被databinder.eval使用的命名容器。
<%# databinder.eval(container.dataitem, "integervalue", "{0:c}") %>
格式化字符串參數是可選的。如果忽略參數,databinder.eval 返回對象類型的值,就象下面的代碼這樣:
<%# (bool)databinder.eval(container.dataitem, "boolvalue") %>
很重要的一點需要注意:由于受后期綁定影響,databinder.eval與標準的數據綁定語法相比,在執行效率上有明顯的差別。因此有選擇地使用databinder.eval,特別是不需要對字符串進行格式化的時候。
新聞熱點
疑難解答
圖片精選