302班

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

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

          Posted on 2007-07-20 17:21 停留的風 閱讀(366) 評論(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()看似把問題簡化了,其實把問題搞得更加神秘。

          主站蜘蛛池模板: 麻江县| 无为县| 老河口市| 镇赉县| 天全县| 沁阳市| 柳江县| 涿州市| 会昌县| 台山市| 绵阳市| 比如县| 柳州市| 伊金霍洛旗| 河南省| 遵化市| 沂南县| 肥西县| 基隆市| 大洼县| 高碑店市| 蓬溪县| 通道| 内黄县| 武定县| 西乌珠穆沁旗| 沧源| 东乡| 宝山区| 利川市| 松潘县| 天祝| 留坝县| 甘孜| 双江| 东方市| 德昌县| 黄石市| 隆化县| 西吉县| 阳江市|