ASP.NET 2.0包含兩個層次資料來源控制項:用於串連XML檔案的XmlDataSource和用於串連網站導覽資料的SiteMapDataSource。這一部分將介紹這些控制項的使用技術。
資料來源控制項可以同時暴露平面表格式的或層次的資料。前面示範的SqlDataSource和ObjectDataSource控制項都是平面表格式的資料來源控制項。ASP.NET 2.0還包含兩個層次資料來源控制項:用於串連XML檔案的XmlDataSource和用於串連網站導覽資料的SiteMapDataSource。
資料來源控制項可以同時暴露平面表格式的或層次的資料。前面示範的SqlDataSource和ObjectDataSource控制項都是平面表格式的資料來源控制項。ASP.NET 2.0還包含兩個層次資料來源控制項:用於串連XML檔案的XmlDataSource和用於串連網站導覽資料的SiteMapDataSource。這一部分將介紹這些控制項的使用技術。
TreeView和Menu控制項
資料繫結控制項與資料來源控制項類似,也可以是層次的。表格式資料繫結控制項顯示資料列表或表格,層次資料繫結控制項能夠用遞規方式擷取層次資料,在UI中用父-子關係顯示資料。ASP.NET 2.0中的分層資料繫結控制項的例子有TreeView和Menu控制項。下面將介紹把這些控制項綁定到層次資料來源的一些技術,包括很多樣本。
綁定到XML
XmlDataSource控制項允許其它控制項綁定到XML資料。XmlDataSource支援DataFile屬性,它被用於指定作為輸入(input)的XML資料檔案的路徑。你還可以指定TranformFile屬性,給資料應用XSLT轉換;設定XPath屬性來指定需要暴露的資料來源節點的子集。
下面的例子示範了一個通過XmlDataSource控制項綁定到XML檔案的TreeView控制項。這個TreeView把每個TreeNode對象的屬性與分層樹中的XML節點的屬性關聯起來了(為了進行資料繫結,XML節點的屬性都被處理為資料項目的屬性)。在預設情況下,TreeView控制項通過調用對象的ToString()方法簡單地顯示資料項目。它顯示了XML節點的元素(element)名稱,這樣你就可以看到TreeView所綁定的節點層次。它不一定能夠顯示出你所需要的內容,但它提供了一個很好的出發點,未來你將更容易定製XML資料的顯示方式。
<asp:XmlDataSource ID="MySource" DataFile="~/App_Data/Bookstore.xml" runat="server"/>
<asp:TreeView ID="TreeView1" SkinId="Bookstore" DataSourceId="MySource"
ExpandDepth="3" MaxDataBindDepth="3" runat="server" />
為了讓TreeView顯示更有意義的內容,你可以為樹中的每個節點指定不同的資料繫結。為了定義層次資料項目的欄位如何映射到TreeNode屬性,你可以把TreeNodeBinding對象添加到TreeView的Databindings集合中。TreeNodeBinding的兩個重要屬性決定了如何在層次資料項目集合上使用綁定。DataMember屬性指定了資料項目的類型或者XML資料中用於綁定的元素名稱。Depth屬性指定了應用於層次樹的資料繫結的深度。你可以設定DataMember或Depth,或者兩個屬性都設定。例如,如果要定義XML檔案中的所有Book元素的資料繫結,只需要把DataMember設定為“Book”。為了定義所有深度為1的節點的資料繫結,只需要把Depth設定為1。如果要定義深度為1的所有Book節點,需要把TreeNodeBinding對象的DataMember設定為“Book”,同時把Depth設定為1。
當你設定了DataMember或Depth用於匹配節點集合之後,就可以定義TreeNodeDataBinding的另外一些屬性來定製資料項目的屬性(或XML資料中的XML節點屬性)如何映射到TreeView控制項的TreeNode的屬性。例如,TextField屬性定義了顯示為TreeNode文本的屬性名稱;類似地,ValueField屬性定義了作為TreeNode值的資料項目屬性;NavigateUrlField屬性定義了TreeNode導航連結的欄位/屬性,等等。你還可以為一個已有資料繫結的TreeNode屬性指定靜態值。例如,指定Book元素的TreeNode使用"Book.gif"映像、設定DataMember屬性是"Book"的TreeNodeBinding的ImageUrl屬性。
下面的例子示範了一個綁定到XML資料的TreeView,資料繫結只應用在XML層次樹的特定元素上。
<Databindings>
<asp:TreeNodeBinding DataMember="Bookstore" Text="Bookstore"
ImageUrl="~/images/xp/folder.gif" />
<asp:TreeNodeBinding DataMember="genre" TextField="name"
ImageUrl="~/images/xp/folder.gif" />
</Databindings>
XmlDataSource支援XPath屬性,你可以用它來過濾資料來源所暴露的節點集合。在下面的例子中,Xpath屬性被設定為Bookstore/genre[@name='Business']/book,以過濾資料來源的節點,僅顯示"Business"類型下的book元素。在指定XPath屬性的文法時要特別小心,否則可能出現資料來源任何節點都不暴露的情況(相關的資料繫結控制項也不會顯示)。
<asp:XmlDataSource ID="MySource" DataFile="~/App_Data/Bookstore.xml"
XPath="Bookstore/genre[@name='Business']/book" runat="server"/>
請注意,TreeView樹準確地匹配了源XML中的層次。由於這個原因,通常會為了綁定到TreeView而具體構造XML,或者為了綁定到TreeView而使用XSL轉換重新把資料構造為適當的分層結構。
<asp:XmlDataSource ID="MySource" DataFile="~/App_Data/Bookstore2.xml"
TransformFile="~/App_Data/Bookstore2.xsl"
XPath="Bookstore/genre[@name='Business']/book" runat="server"/>
把表格式資料繫結控制項綁定到分層資料來源也是可行的,但是它只能顯示第一層資料。在下面的例子中,模板化的DataList控制項綁定到bookstore XML檔案。由於資料來源暴露的頂層節點是<book/>節點,DataList可以在自己的ItemTemplate模板中使用Eval資料繫結文法綁定到這些節點的屬性。
<asp:DataList id="MyDataList" DataSourceId="MySource" runat="server">
<ItemTemplate>
<img alt="Cover Image" src='<%#"images/" + Eval("ISBN") + ".gif"%>'>
<%# Eval("Title") %>
ISBN: <%# Eval("ISBN") %>
Price: <%# Eval("Price") %>
</ItemTemplate>
</asp:DataList>