說來也奇怪,最近做了一個Web的項目,需要用到分頁,那么數據綁定的學習也變的很重要了,下面結合博客園大牛們的文章來做個總結吧!
1.數據綁定表達式
①表達式
<%# 數據綁定表達式 %>
②在頁面編寫代碼
<%= C#代碼 %> //調用后台變量或者方法的時候,會用到這種表達式
2.單向綁定
提供一個單向的只讀的數據值,只能從數據源中讀取數據,不能修改數據源中的數據!
語法:
Eval(“列名|屬性名等等”)
原理:通過反射的機制來實現綁定計算,寫“Eval”會在底層調用DataBinder中的靜態方法Eval!
推薦使用:DataBinder.Eval()用這種方式來綁定數據!
上面是他的三個重載方法!
第一個參數始終是 → Container.DataItem
第二個參數是 → 你要綁定的數據,如列名,屬性名等等
第三個參數是 → 字符串格式化
如果需要詳細了解,請參考:深入ASP.NET數據綁定(上),這是一篇深入理解單向數據綁定的好文!
3.雙向綁定
雙向綁定:既可以讀取數據源的值,又可以修改數據源的值,以便進行數據的更新,主要用於GridView,DataList等支持編輯功能的控件!
語法:
Bind(“列名|屬性名等等”)
推薦文章:深入ASP.NET數據綁定(中)——數據雙向綁定機理
4.數據綁定表達式可以是哪些類型呢?
①可以是個變量
例如:<asp:Label ID="Label1" runat="server" Text="<%= 變量名%>"></asp:Label>
注意如果是變量,變量的反問修飾符不能是私有的,必須要為“public”或“protected”的!
Note:變量必須使用“=”才能有效果!
②可以是服務器控件的屬性值
例如:<asp:Label ID="Label1" runat="server" Text="<%#TextBox2.Text %>"></asp:Label>
③可以是一個數組或集合
這種類型主要針對“DropDownList”,“ListBox”這類的控件!
有一個數組: public string[] str = { "22", "333", "4444444", "55555555555" };
那么你可以在前端進行綁定:<asp:DropDownList ID="DropDownList1" runat="server" DataSource="<%# str %>" > </asp:DropDownList>
Note:你必須要在后台調用控件的“DataBind”方法,不然是沒有效果的!
④可以是個表達式
這個說明,你可以使用幾種數據並接成你想要的數據!
如:我們要在一個Label中顯示一個用戶的全名,那么我們就可以這樣寫<%#(Person.FirstName+"" + Person.LastName)%>。
⑤可以是個方法
一開始以為也是使用上面的綁定方法,但是試了好多次都沒效果,最后使用了另一種方式 → <% = MyReturn() %>,加了一個等於號,不是使用“#”!
⑥DataTable,DataSet等類型
Eval和DataBinder.Eval進行數據綁定!
這樣的數據綁定表達式只能用於Repeater,GridView,DataList等等這些控件中!
推薦文章:淺談.NET中的數據綁定表達式(一)
5.數據綁定表達式的演變
①第一種:最常用的
“Eval”是很多人經常在GridView,Repeater,DataList等控件中使用最多的!
②第二種:第一種方法的Father
這種寫法也比較常見:
<%# DataBinder.Eval(Container.DataItem,”max_lvl”,”{0:c}” ) %>
Note:唯一要注意的是參數的選擇!
第一種方法只是把第二種方法進行簡化,底層還是會調用第二種方法的!
③第三種:性能最好的
如果是DataTable或DataSet類型必須要到用命名空間 → <%@ Import namespace="System.Data" %>
<%# ((DataRowView)Container.DataItem)["age"]%>
也可以這樣寫:
<%#(Container.DataItem as DataRowView)["ProductName"].ToString() %>
語法:
((DataRowView)(Container.DataItem))["列名"]/[列索引]的方式來
通用寫法: ((Type)(Container.DataItem)) + 后面是你要獲取的值
Note:Type是你的數據類型,可以是集合,DataTable等等!
演變歷程:第三種 → 第二種 → 第一種,所以說現在很多人還在用Eval進行數據綁定,學過數據綁定的人都知道使用第三種方式是最好的!
推薦文章:淺談.NET中的數據綁定表達式(一)
6.查看動態編譯頁面的程序集,有助於我們深入理解數據綁定底層原理
說實話不知道怎么用專業術語來表達,我的理解就是 → 這個程序集是基於C#代碼和HTML的中間語言!
動態程序集查看地址:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
找到程序集使用Reflector來查看程序集,如果細致的看下去,我相信你應該有很大的收獲的!
推薦文章::深入ASP.NET數據綁定(上),一步一步的帶你熟悉頁面編譯代碼!
7.自定義數據綁定格式
這個想法來源於一個博友的創新idea!參考:教你30秒打造強類型ASP.NET數據綁定!
其中有dudu大牛的改進版:強類型ASP.NET數據綁定改進版,以及增強版:強類型ASP.NET數據綁定改進版之第2版!
自定義代碼如下:
1 public static class DataBindHelper
2 {
3 public static TResult Eval<TEntity, TResult>(this Page page, Func<TEntity, TResult> func)
4 {
5 var item = page.GetDataItem(); //這就是核心代碼
6 return func((TEntity)item);
7 }
8 }
前台調用代碼示例:
1 <asp:Repeater ID="Repeater1" runat="server">
2 <ItemTemplate>
3 <%# DataBindHelper.Eval<People,string>(this,p=>p.Name)%>
4 </ItemTemplate>
5 </asp:Repeater>
通過自定義的數據綁定格式能更友好的實現數據綁定!
Note:最好在VS2010上面實驗,因為我在2010和2008一樣的代碼,運行時2008就報錯了,“無效的表達式“>”,如果知道的朋友可以告訴我!
8.淺談數據綁定底層機制
首先要記住在第七點中那句“page.GetDataItem()”代碼,這句話可謂說是數據綁定的核心了,它的意思就是 → 獲取綁定上下文堆棧頂部的對象!
有人說理解這個了,數據綁定技術也就是理解80% - 90%了,所以下面我們就重點研究下他!
說白了就是從堆里面讀數據,只是微軟封裝的太厲害,只看到華麗的外表了!
推薦文章:深入剖析了各個數據綁定表達式的性能問題 → 淺談.NET中的數據綁定表達式(二)
9.最后來個總結
靈活運行數據綁定技術可以加快開發速度,但千萬不要濫用,在合適的場合運行合適的數據綁定,還有選擇合適的數據綁定格式也很重要!
1 <%# DataBindHelper.Eval<People,string>(this,p=>p.Name)%> //定義數據綁定格式
2 <%# DataBinder.GetDataItem("Name") %>
3 <%# ((People)GetDataItem()).Name %>
4 <%# ((People)Container.DataItem).Name %>
5 <%# Eval("Name") %>
6 <%# DataBinder.Eval(Container.DataItem,"Name","") %>
7 <%# ((System.Data.DataRowView)GetDataItem())[0] %>
8 <%# ((System.Data.DataRowView)Container.DataItem)[0] %>
其實如果大家認真發現,以及使用Reflector去查看源代碼,就會知道“GetDataItem”這個方法其實是最重要的,通過它去獲取綁定上下文堆棧頂部的對象,從而實現綁定!
最后:大家如果跟着本文的步驟去一步步了解大牛們的文章,我相信你對數據綁定一定會有很深入的理解的!