302班

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

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

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

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

           Eval()是Page的父類TemplateControl的方法
           TemplateControl.Eval()可以自動計算出Container, 機制就是從一個dataBindingContext:Stack堆棧來獲取。
           
           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()在計算的時候還是引用了Container.DataItem,只不過這個DataItem通過DataItem Container堆棧自動計算出來的。我認為Page.Eval()看似把問題簡化了,其實把問題搞得更加神秘。

          主站蜘蛛池模板: 和平区| 南木林县| 淮阳县| 丹阳市| 永靖县| 新巴尔虎左旗| 石狮市| 桑日县| 嘉黎县| 阿勒泰市| 兴安盟| 正蓝旗| 宾川县| 炎陵县| 西平县| 苍南县| 法库县| 读书| 冕宁县| 蒙阴县| 高阳县| 赤水市| 白城市| 临武县| 滨海县| 双流县| 通榆县| 洪湖市| 霍城县| 密山市| 龙川县| 南江县| 台东县| 张北县| 临漳县| 吕梁市| 秀山| 台北市| 古蔺县| 万年县| 肥城市|