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