302班

          java突擊隊(duì)
          posts - 151, comments - 74, trackbacks - 0, articles - 14
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          ASP.NET 2.0 的數(shù)據(jù)綁定函數(shù)Eval()簡(jiǎn)化掉了ASP 1.1神秘的Container.DataItem,比如數(shù)據(jù)綁定表達(dá)式:

           <%# (Container.DataItem as DataRowView)["ProductName"].ToString() %>      

           ASP 1.1簡(jiǎn)化為:(去掉了類型指定, Eval通過(guò)反射實(shí)現(xiàn),本文不再闡述)
           <%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>      

           ASP 2.0又簡(jiǎn)化為,去掉了Container局部變量:
           <%# Eval("ProductName") %>
           
           那么,Page.Eval()又是如何知道"ProductName"是那個(gè)數(shù)據(jù)的屬性呢,即Container.DataItem真的消失了嗎?

           Eval()是Page的父類TemplateControl的方法
           TemplateControl.Eval()可以自動(dòng)計(jì)算出Container, 機(jī)制就是從一個(gè)dataBindingContext:Stack堆棧來(lái)獲取。
           
           1. 建立DataItem Container 棧:
              在Control.DataBind()中,建立,這樣可以保證子控件的DataItem Container始終在棧頂。
             
              public class Control
              {
                  protected virtual void DataBind(bool raiseOnDataBinding)
                  {
                      bool foundDataItem = false;
                      if (this.IsBindingContainer)
                      {
                          object o = DataBinder.GetDataItem(this, out foundDataItem);
                          if (foundDataItem)
                              Page.PushDataItemContext(o);        <-- 將DataItem壓入堆棧
                      }
                      try
                      {
                          if (raiseOnDataBinding)
                              OnDataBinding(EventArgs.Empty);
                             
                          DataBindChildren();                     <-- 綁定子控件
                      }
                      finally
                      {
                          if (foundDataItem)
                              Page.PopDataItemContext();          <-- 將DataItem彈出堆棧
                      }
                  }
              }

            2. 獲取DataItem Container
              public class Page
              {   
                  public object GetDataItem()
                  {
                      ...
                      return this._dataBindingContext.Peek();     <-- 讀取堆棧頂部的DataItem Container,就是正在綁定的DataItem Container
                  }
               }
              
             3. TemplateControl.Eval()
              public class TemplateControl
              {
                  protected string Eval (string expression, string format)
                  {
                      return DataBinder.Eval (Page.GetDataItem(), expression, format);   
                  }
              }        

          結(jié)論:從上面看出Page.Eval()在計(jì)算的時(shí)候還是引用了Container.DataItem,只不過(guò)這個(gè)DataItem通過(guò)DataItem Container堆棧自動(dòng)計(jì)算出來(lái)的。我認(rèn)為Page.Eval()看似把問(wèn)題簡(jiǎn)化了,其實(shí)把問(wèn)題搞得更加神秘。

          主站蜘蛛池模板: 张家川| 丰宁| 巴林右旗| 理塘县| 灌阳县| 汕头市| 左权县| 简阳市| 玛沁县| 太康县| 桃源县| 三台县| 永胜县| 米易县| 夹江县| 云阳县| 邵阳县| 肇州县| 宁武县| 宜阳县| 睢宁县| 女性| 淮阳县| 富锦市| 甘孜县| 湖州市| 工布江达县| 涪陵区| 成安县| 新和县| 台州市| 富川| 福鼎市| 嘉禾县| 永宁县| 漳州市| 沾化县| 郯城县| 古丈县| 竹山县| 莱州市|