學習之路七:一步一步學習ASP.NET數據綁定


  說來也奇怪,最近做了一個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”這個方法其實是最重要的,通過它去獲取綁定上下文堆棧頂部的對象,從而實現綁定!


  最后:大家如果跟着本文的步驟去一步步了解大牛們的文章,我相信你對數據綁定一定會有很深入的理解的!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM