新的數(shù)據(jù)源控件和數(shù)據(jù)綁結(jié)構(gòu)是很棒的特性,它可以簡(jiǎn)化程序的調(diào)試時(shí)間(尤其是對(duì)簡(jiǎn)單需求和沒(méi)有太多framewark知識(shí)的人)。然而,對(duì)于一個(gè)核心開(kāi)發(fā)者來(lái)說(shuō),因?yàn)榉庋b而不是很正確完整的了解數(shù)據(jù)綁定的結(jié)構(gòu),是很是問(wèn)題和不幸的,沒(méi)有很完善的文檔來(lái)說(shuō)明它.... 我將解釋一些不易理解的“magic”。
BaseDataBoundControl 被設(shè)計(jì)為使用 ASP.NET 數(shù)據(jù)源控件的數(shù)據(jù)綁定控件從 BaseDataBoundControl 控件類派生,該控件類定義基數(shù)據(jù)綁定控件的功能。這個(gè)類有下面的公共方法。
virtual object DataSource { get; set; } virtual string DataSourceId { get; set; }
和下面的受保護(hù)的方法 protected abstract void PerformSelect(); protected abstract void ValidateDataSource(object dataSource);
第一個(gè)(DataSource)我們用來(lái)綁定數(shù)據(jù)在asp.net 1.x.第二個(gè)(DataSouceID)是使一個(gè)數(shù)據(jù)綁定控件“工作”在一個(gè)數(shù)據(jù)源控件上。當(dāng)設(shè)置 DataSource 屬性時(shí),將調(diào)用 ValidateDataSource 方法,它驗(yàn)證數(shù)據(jù)綁定控件綁定到的對(duì)象是它可以使用的對(duì)象(通常是IListSource,IEnumerable或者IDataSouce).更多的受保護(hù)方法回來(lái)在再講.
如果你更改DataSouceID在數(shù)據(jù)綁定控件初始化后,就會(huì)立刻顯式調(diào)用DataBind方法。注意如果你在PreLoad之前設(shè)置DataSouceID,DataBind方式不會(huì)被調(diào)用。
這個(gè)類參與的頁(yè)面生命周期: *OnInit:如果視圖狀態(tài)(ViewState)是禁用的,控件每次PreRender將被綁定。 *OnPreLoad:設(shè)置一個(gè)內(nèi)部標(biāo)記表征在初始化(init)過(guò)程結(jié)束。 *OnPreRender:設(shè)置一個(gè)內(nèi)部標(biāo)記表征在開(kāi)始PreRender過(guò)程,調(diào)用DataBind方法。
這個(gè)類有一個(gè)公共方法: public override void DataBind();
這個(gè)方法調(diào)用受保護(hù)的方法PerformSelect,從關(guān)聯(lián)數(shù)據(jù)源檢索廣告數(shù)據(jù).
DataBoundControl DataBoundControl繼承自BaseDataBound,作為所有以列表或表格形式顯示數(shù)據(jù)的數(shù)據(jù)綁定控件的基類使用。它添加了一個(gè)公共屬性: public virtual string DataMember { get; set; }
它是當(dāng)數(shù)據(jù)源包含多個(gè)不同的數(shù)據(jù)項(xiàng)列表時(shí),獲取或設(shè)置數(shù)據(jù)綁定控件綁定到的數(shù)據(jù)列表的名稱。
這個(gè)類完成的主要工作是隔離派生類獲取來(lái)自數(shù)據(jù)源的數(shù)據(jù)(記住,控件可以使用DataSouce或者DataSouceID屬性來(lái)綁定,它是支持這兩種數(shù)據(jù)源的方式)。數(shù)據(jù)將出現(xiàn)在從IEnumerable派生來(lái)的類,重寫(xiě)下面的保護(hù)方法:
protected internal virtual void PerformDataBinding(IEnumerable data);
幸運(yùn)的,很難的工作已經(jīng)由ConnectToDataSourceView完成了,它得到一個(gè)數(shù)據(jù)源視圖。最直接的方法是用DataSourceID綁定控件,但是作為數(shù)據(jù)源控件為了暴露數(shù)據(jù)源它必須對(duì)類封裝(只讀的數(shù)據(jù)源從IDataSouce實(shí)現(xiàn),返回一個(gè)只支持select方法的視圖(只讀數(shù)據(jù)源視圖))。
這個(gè)類參與的頁(yè)面生命周期: *OnPreLoad:調(diào)用基類OnPreLoad,若數(shù)據(jù)綁定控件還未綁定,如果是第一次頁(yè)面請(qǐng)求且啟動(dòng)視圖狀態(tài),去設(shè)置一個(gè)標(biāo)識(shí)在OnPreRender過(guò)程試著去綁定數(shù)據(jù)。 *OnLoad:設(shè)法從數(shù)據(jù)源中得到視圖(如果它還沒(méi)有),如果某種原因在OnPreRender過(guò)程沒(méi)有試著去綁定數(shù)據(jù)且數(shù)據(jù)沒(méi)有被綁定,去設(shè)置一個(gè)標(biāo)識(shí)在OnPreRender過(guò)程試著去綁定數(shù)據(jù)。
你看到了,當(dāng)在PreLoad過(guò)程之前如果設(shè)置了DataSouceID,為了自動(dòng)綁定數(shù)據(jù),這個(gè)類補(bǔ)充了基類留下的未完成的。
如果數(shù)據(jù)綁定控件用DataSouceID去綁定,當(dāng)數(shù)據(jù)源改變的時(shí)候,DataSourceView就會(huì)重新綁定,控件可以捕獲到DataSouceViewChanged事件。
這個(gè)類實(shí)現(xiàn)的保護(hù)方法在BaseDataBoundControl屬性中調(diào)用。ValidateDataSouce和PerformSelect已重寫(xiě)。第一個(gè)檢查為 DataSource 屬性設(shè)置的對(duì)象類型,確保其是 IDataSource、IListSource 或 IEnumerable 接口的實(shí)例,如果不是會(huì)觸發(fā)一個(gè)異常。第二個(gè)(PerformSelect)在DatBind方法中被調(diào)用,做下面的事情: *如果我們用DataSouce來(lái)綁定,觸發(fā)DataBinding事件 *從數(shù)據(jù)源中得到數(shù)據(jù)源視圖(DataSourceView) *標(biāo)記控件已經(jīng)綁定 *建立select相關(guān)參數(shù),調(diào)用DataSourceView的select方法,當(dāng)Select方法完成后通過(guò)回調(diào)(提供一個(gè)執(zhí)行任何自定義數(shù)據(jù)工作的 DataSourceViewSelectCallback 委托)來(lái)被調(diào)用。
|