ASP.NET的XML數(shù)據(jù)
將數(shù)據(jù)源控件綁定到XML數(shù)據(jù)的方法有兩種:使用任意XML文檔和使用DataSet對(duì)象的XML表示形式。在前一種情況下,您可以使用分層的數(shù)據(jù)源控件 (XmlDataSource);而在后一種情況下,您可以使用表格式數(shù)據(jù)源組件(DataSetDataSource)。可以通過URL (DataFile屬性)或字符串(Data屬性)來指定XML數(shù)據(jù)。可以使用SchemaFile或Schema屬性以相同的方式來提供架構(gòu)信息。
XmlDataSource控件可以綁定到表格式和分層式數(shù)據(jù)綁定控件。XML數(shù)據(jù)的表格式視圖只是處于層次結(jié)構(gòu)給定級(jí)別的一系列節(jié)點(diǎn),而分層式視圖則顯示了完整的層次結(jié)構(gòu),但需要一個(gè)多級(jí)控件,如TreeView、Menu或其他任何繼承了HierarchicalDataBoundControl類的控件。
相反,DataSetDataSource類只能綁定到GridView和其他列表控件。您不能用DataSet類的活動(dòng)實(shí)例來填充DataSetDataSource。但是,在您成功初始化該控件之后,就可以使用GetDataSet方法檢索內(nèi)部的DataSet對(duì)象。
內(nèi)幕初探
數(shù)據(jù)源控件繼承了基類Control,并且具有兩種形式:表格式和分層式。DataSourceControl抽象類充當(dāng)所有數(shù)據(jù)源控件的基類,并且定義了數(shù)據(jù)綁定控件和基礎(chǔ)數(shù)據(jù)之間的接口。盡管數(shù)據(jù)源控件不具有可視化表現(xiàn)形式,但仍然將其實(shí)現(xiàn)為控件,以便使“聲明性持久性”(在請(qǐng)求處理過程中自動(dòng)實(shí)例化)成為.aspx源代碼的原生部分,并且獲得對(duì)頁(yè)面視圖狀態(tài)的訪問權(quán)限。
數(shù)據(jù)源控件通過一組屬性和方法來公開它的基礎(chǔ)數(shù)據(jù)源的內(nèi)容。這些成員中的一部分是特定于該控件的,而其他成員則為所有源控件所共有,并且被定義為 IDataSource接口的一部分。所有數(shù)據(jù)源控件都實(shí)現(xiàn)了IDataSource接口,并且使用該接口的屬性和方法來將綁定的內(nèi)容公開為一組命名的視圖。
IDataSource接口很簡(jiǎn)單,它只包含一個(gè)事件(DataSourceChanged)和幾個(gè)方法(GetView和GetViewNames)。當(dāng)綁定的數(shù)據(jù)源更改時(shí)(例如,當(dāng)您更改連接字符串時(shí)),將引發(fā)DataSourceChanged事件。GetView獲得要檢索的數(shù)據(jù)源視圖的名稱,并且將其作為DataSourceView對(duì)象返回。GetViewNames返回表示與該控件關(guān)聯(lián)的視圖對(duì)象列表的名稱集合。因此,數(shù)據(jù)源控件的內(nèi)部體系結(jié)構(gòu)好像一個(gè)命名的視圖集合。
命名的視圖用DataSourceView類的實(shí)例表示,后者類似于ADO.NET DataView類。DataSourceView表示已經(jīng)在其中定義了排序、篩選和其他數(shù)據(jù)操作特殊設(shè)置的數(shù)據(jù)的自定義視圖。在其核心,數(shù)據(jù)源控件可以簡(jiǎn)單地管理從基礎(chǔ)數(shù)據(jù)源加載的數(shù)據(jù)的視圖。
DataSourceView類是與數(shù)據(jù)源控件相關(guān)聯(lián)的所有視圖的基類。數(shù)據(jù)源控件中的視圖數(shù)量取決于連接字符串、特征以及基礎(chǔ)數(shù)據(jù)源的實(shí)際內(nèi)容。
CanDelete Boolean 屬性。指示是否允許對(duì)基礎(chǔ)數(shù)據(jù)源進(jìn)行刪除操作。通過調(diào)用 Delete 方法進(jìn)行刪除。
CanInsert Boolean 屬性。指示是否允許對(duì)基礎(chǔ)數(shù)據(jù)源進(jìn)行插入操作。通過調(diào)用 Insert 方法進(jìn)行插入。
CanPage Boolean 屬性。指示基礎(chǔ)數(shù)據(jù)源是否支持分頁(yè)。
CanRetrieveTotalRowCount Boolean 屬性。指示基礎(chǔ)數(shù)據(jù)源是否能夠檢索數(shù)據(jù)行(而不是數(shù)據(jù))的總數(shù)。
CanSort Boolean 屬性。指示是否能夠存儲(chǔ)視圖中的數(shù)據(jù)。
CanUpdate Boolean 屬性。指示是否允許對(duì)基礎(chǔ)數(shù)據(jù)源進(jìn)行更新操作。通過調(diào)用 Update 方法進(jìn)行更新。
Name 字符串屬性。返回當(dāng)前視圖名。
SortExpression 字符串屬性。獲取并設(shè)置用于創(chuàng)建基礎(chǔ)數(shù)據(jù)排序視圖的排序表達(dá)式。
Delete 方法,執(zhí)行與視圖相關(guān)數(shù)據(jù)的刪除操作。
Insert 方法,執(zhí)行與視圖相關(guān)數(shù)據(jù)的插入操作。
Select 方法,返回一個(gè)枚舉對(duì)象(以基礎(chǔ)數(shù)據(jù)源存儲(chǔ)中包含的數(shù)據(jù)進(jìn)行填充)。
Update 方法,執(zhí)行與視圖相關(guān)數(shù)據(jù)的更新操作。
簡(jiǎn)化的數(shù)據(jù)綁定語(yǔ)法
無可否認(rèn),數(shù)據(jù)綁定方面的重大更改就是引入了數(shù)據(jù)源控件。那么,對(duì)于以前支持的數(shù)據(jù)綁定表達(dá)式而言,會(huì)發(fā)生什么情況呢?該功能在ASP.NET 2.0中保持不變,但所使用的語(yǔ)法已經(jīng)進(jìn)行了簡(jiǎn)化,不像原來在ASP.NET版本1.x中那樣繁瑣了。
在ASP.NET 1.x中,您通常使用靜態(tài)方法DataBinder.Eval將數(shù)據(jù)存儲(chǔ)區(qū)字段晚期綁定到對(duì)象屬性,如下面的示例所示:
- <%# DataBinder.Eval(Container.DataItem, fieldName, formatString) %>
Container.DataItem表達(dá)式引用在其上計(jì)算該表達(dá)式的對(duì)象。該表達(dá)式通常是一個(gè)字符串,該字符串具有要在數(shù)據(jù)項(xiàng)對(duì)象上訪問的字段的名稱。通常,該表達(dá)式可以包含索引和屬性名稱。這些常用代碼可能頻繁地在頁(yè)面的同一表單中重復(fù)使用。只有表達(dá)式和格式字符串各不相同。ASP.NET 2.0支持經(jīng)過簡(jiǎn)化的語(yǔ)法,如下面的代碼片段所示:
- <%# Eval(fieldName, formatString) %>
當(dāng)頁(yè)面被編譯以供使用時(shí),會(huì)將Eval調(diào)用作為一個(gè)獨(dú)立調(diào)用插入該頁(yè)面的源代碼中。下面的代碼可以使您了解實(shí)際發(fā)生的事情:
- object o = Eval(fieldName); string result = Convert.ToString(o);
該調(diào)用的結(jié)果被轉(zhuǎn)換為字符串并分配給一個(gè)數(shù)據(jù)綁定文本控件(它是DataBoundLiteralControl類的實(shí)例)。最后,將數(shù)據(jù)綁定文本插入該頁(yè)面的控件樹中。在ASP.NET 2.0中,Page類新增了一個(gè)名為Eval的受保護(hù)方法,該方法可確定當(dāng)前的數(shù)據(jù)項(xiàng)對(duì)象,并調(diào)入原來的DataBinder.Eval靜態(tài)方法。
除了DataBinder類,ASP.NET 2.0還提供了一個(gè)對(duì)象,該對(duì)象能夠綁定到針對(duì)實(shí)現(xiàn)IXPathNavigable接口的對(duì)象而執(zhí)行的XPath表達(dá)式的結(jié)果。該類為 XPathBinder,并且與DataBinder起到相同的作用,不同之處在于它在XML數(shù)據(jù)上工作:
< %# XPath("Orders/Order/Customer/LastName") %>
與Eval一樣,該表達(dá)式中的XPath關(guān)鍵字是Page類上的一個(gè)新的受保護(hù)方法。它可以調(diào)入靜態(tài)方法XPathBinder.Eval。在內(nèi)部,XPathBinder.Eval從數(shù)據(jù)源中獲取一個(gè)導(dǎo)航器對(duì)象,并且計(jì)算指定的表達(dá)式。
XPathBinder類還具有一個(gè)Select方法。該方法可以執(zhí)行XPath查詢,并檢索節(jié)點(diǎn)集(XML節(jié)點(diǎn)的可枚舉集合)。該集合可以作為晚期綁定值分配給像Repeater控件這樣的數(shù)據(jù)綁定控件。對(duì)于該方案,也存在等效的簡(jiǎn)化語(yǔ)法:
- <asp:Repeater
- runat="server"
- DataSource='<%# XPathSelect("orders/order/summary") %>'
- >
- ...
- </asp:Repeater>
XpathSelect是您在數(shù)據(jù)綁定表達(dá)式中使用的關(guān)鍵字,用于指示在容器對(duì)象上執(zhí)行的XPath查詢的結(jié)果。如果該容器對(duì)象未實(shí)現(xiàn)IXPathNavigable,則會(huì)引發(fā)異常。
【編輯推薦】

















