在這個系列的上篇中介紹了數據綁定語法的原理以及.NET中如何實現單向綁定,中篇我們簡單的介紹 了ASP.NET 2.0 中新增的Bind語法配合DataSourceControl來實現數據的自動雙向綁定。這兩部分的內容 相對動態抽象並且不常接觸,沒有很好的源代碼支持很難解釋清楚,要想真正弄清它們的內部原理,還需 要大家親自動手去反編譯分析動態編譯的程序集。
在了解了數據綁定語法的原理後,我還想來談談我中實踐過程中遇到的一些問題以及其它實用的綁定 技巧。首先我們就來說說,特殊字段名的問題。我們知道在數據庫當中,如果表名或字段名中包含有一些 特殊的不能是合法的字符時,都會使用[]將它們引起來,以便他們能夠正常使用。但是在<%# Eval ("")%>的綁定語句當中,同時可以使用[],但是對於字段名中包含 "(",")","[","]"這4個字符卻始終 運行出錯。假設像我下面這樣來綁定"電壓(V)":
<%# Eval("電壓(V)")%>
那麼就會得到一個運行時錯誤:
DataBinding:“System.Data.DataRowView”不包含名為“電壓”的屬性。
表明括號是被認為是一個特殊字符,那我們如果給字段名加上[],如下:
<%# Eval("[電壓(V)]")%>
此時,我們會得到另一個運行時錯誤:
電壓(V 既不是表 DataTable1 的 DataColumn 也不是 DataRelation。
表明,即使加上[]也無法解決這個特殊字段名的問題。同時字段名中如果也存在中括號,也是會出現 這樣的問題的。但是這樣的字段名卻在GridView的自動生成列中能被正常綁定呢?問題會出現在哪裡呢? 分析和對比GridView的自動生成列與Eval這樣的綁定語法在最終執行綁定代碼上的不同,我們可以發現, GridView的自動生成列取值並不是使用DataBinder.Eval這個方法,它內部有自己的取值方式,但是在實 現上卻是大同小異的。那究竟是在哪裡出現了問題呢?我們找出DataBinder類的定義: