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

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

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

    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)題搞得更加神秘。

    主站蜘蛛池模板: 粉色视频免费入口| 国产91久久久久久久免费| 日韩精品免费一线在线观看| 亚洲日产2021三区| 国产AV无码专区亚洲A∨毛片| 国产a不卡片精品免费观看| 免费看黄视频网站| 91高清免费国产自产拍2021| 一区二区免费电影| 色噜噜狠狠色综合免费视频| 亚洲无吗在线视频| 亚洲无圣光一区二区| 亚洲情a成黄在线观看动漫尤物| 亚洲人成网站在线观看青青| 四虎永久精品免费观看| 青娱乐免费在线视频| 182tv免费观看在线视频| 无码专区AAAAAA免费视频| 伊人免费在线观看高清版| jizz免费在线观看| 一级特黄录像免费播放中文版| 久久无码av亚洲精品色午夜| 亚洲色大成网站WWW国产| 久久亚洲精品国产精品婷婷| 亚洲jjzzjjzz在线观看| 亚洲午夜久久久久久尤物| 亚洲综合综合在线| 亚洲成人一级电影| 亚洲伊人久久大香线焦| 亚洲人成7777影视在线观看| 亚洲香蕉久久一区二区三区四区| 亚洲人成网站在线观看播放动漫| 亚洲不卡在线观看| 在线精品亚洲一区二区| 亚洲熟妇自偷自拍另欧美| 亚洲日韩乱码中文字幕| 亚洲av成人无码网站…| 羞羞漫画登录页面免费| 波霸在线精品视频免费观看| 野花香高清在线观看视频播放免费| 久久免费视频观看|