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