<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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ù)綁定表達(dá)式:

     <%# (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堆棧自動計算出來的。我認(rèn)為Page.Eval()看似把問題簡化了,其實把問題搞得更加神秘。

    主站蜘蛛池模板: 亚洲精品无码专区久久久| 日韩免费一区二区三区| 亚洲中文字幕无码不卡电影| 视频一区二区三区免费观看| 国产又粗又猛又爽又黄的免费视频| 亚洲日本久久久午夜精品| 欧美好看的免费电影在线观看| 亚洲区精品久久一区二区三区| 国产精品永久免费10000| 亚洲乱码无限2021芒果| 性生交片免费无码看人| 最新亚洲春色Av无码专区| 日韩成人免费在线| 一级毛片免费视频网站| 中文字幕亚洲乱码熟女一区二区| 免费播放在线日本感人片| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲一级毛片免费看| 24小时日本在线www免费的| 精品久久久久久久久亚洲偷窥女厕| 又粗又黄又猛又爽大片免费| 四虎一区二区成人免费影院网址| 亚洲色WWW成人永久网址| 最近中文字幕免费完整| 亚洲伊人久久大香线蕉AV| 四虎影在线永久免费四虎地址8848aa | 亚洲国产小视频精品久久久三级| 国产精品免费久久久久久久久| 久久青青成人亚洲精品| 久久经典免费视频| 全黄A免费一级毛片| 亚洲国产香蕉碰碰人人| 成年女人视频网站免费m| 免费人成大片在线观看播放电影| 国产精一品亚洲二区在线播放| 亚洲一区二区三区免费在线观看| 久久综合亚洲色hezyo| 亚洲va无码va在线va天堂| 女性自慰aⅴ片高清免费| 国产精品免费久久久久电影网| 亚洲人成电影青青在线播放|