<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

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

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

    主站蜘蛛池模板: 全亚洲最新黄色特级网站 | 又粗又黄又猛又爽大片免费| 亚洲无线一二三四区| 一级特黄aa毛片免费观看| 久久亚洲AV无码精品色午夜麻| 你懂的网址免费国产| 亚洲AV日韩AV天堂久久| 久久久免费精品re6| 亚洲欧洲日产韩国在线| 青苹果乐园免费高清在线| 亚洲色成人网站WWW永久四虎| 永久黄网站色视频免费| 麻豆69堂免费视频| 亚洲日本一区二区一本一道| 中文字幕不卡免费高清视频| 亚洲大片在线观看| 99热在线精品免费全部my| 亚洲精品国产第一综合99久久| 国产免费啪嗒啪嗒视频看看| xxxxx做受大片视频免费| 亚洲成AV人在线观看天堂无码| 亚洲综合免费视频| 狠狠入ady亚洲精品| 国产亚洲福利精品一区| 91九色老熟女免费资源站| 亚洲成av人无码亚洲成av人| 不卡精品国产_亚洲人成在线| 免费精品无码AV片在线观看| 亚洲综合精品第一页| 亚洲日本在线观看视频| 222www免费视频| 亚洲欧美日韩中文二区| 91麻豆精品国产自产在线观看亚洲| 先锋影音资源片午夜在线观看视频免费播放| 亚洲综合久久1区2区3区| 在线观看91精品国产不卡免费| A级毛片成人网站免费看| 亚洲一区二区三区久久久久| 免费乱码中文字幕网站| 99精品视频在线视频免费观看| 久久亚洲AV成人无码国产电影|