302班

          java突擊隊
          posts - 151, comments - 74, trackbacks - 0, articles - 14
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          ASP 2.0 數據綁定函數Eval()的機制

          Posted on 2007-07-20 17:21 停留的風 閱讀(369) 評論(0)  編輯  收藏 所屬分類: .NET技巧特輯
          ASP.NET 2.0 的數據綁定函數Eval()簡化掉了ASP 1.1神秘的Container.DataItem,比如數據綁定表達式:

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

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

           ASP 2.0又簡化為,去掉了Container局部變量:
           <%# Eval("ProductName") %>
           
           那么,Page.Eval()又是如何知道"ProductName"是那個數據的屬性呢,即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);   
                  }
              }        

          結論:從上面看出Page.Eval()在計算的時候還是引用了Container.DataItem,只不過這個DataItem通過DataItem Container堆棧自動計算出來的。我認為Page.Eval()看似把問題簡化了,其實把問題搞得更加神秘。

          主站蜘蛛池模板: 永年县| 宜黄县| 彩票| 清河县| 锡林郭勒盟| 曲靖市| 东光县| 庐江县| 桑日县| 巩义市| 永年县| 蓬溪县| 仁布县| 土默特左旗| 綦江县| 扎兰屯市| 井冈山市| 来宾市| 夏河县| 阳曲县| 汤原县| 原阳县| 石城县| 溧阳市| 瑞丽市| 康定县| 高要市| 泰州市| 鄂尔多斯市| 屏东县| 紫阳县| 桑植县| 台安县| 南部县| 奉化市| 绥宁县| 北辰区| 芜湖市| 鄂州市| 理塘县| 裕民县|