- .NET Web高級開發
- 羅江華 朱永光編著
- 2611字
- 2018-12-29 13:19:40
1.2.1 數據源控件
ASP.NET中包含一些數據源控件,這些數據源控件允許你使用不同類型的數據源,如數據庫、XML文件或中間層業務對象。數據源控件連接到數據源,從中檢索數據,并使得其他控件可以綁定到數據源而無須代碼。數據源控件還支持修改數據。數據源控件模型是可擴展的,因此你還可以創建自己的數據源控件,實現與不同數據源的交互,或為現有的數據源提供附加功能。
在ASP.NET中,提供了幾種不同類型的數據源控件,下面作一個簡單的比較和說明,數據源控件比較詳細情況如表1-2所示。
表1-2 數據源控件

1.ObjectDataSource控件
ObjectDataSource控件使用依賴中間層業務對象來管理數據的Web應用程序中的業務對象或其他類。此控件旨在通過與實現一種或多種方法的對象交互來檢索或修改數據。當數據綁定控件與ObjectDataSource控件交互以檢索或修改數據時,ObjectDataSource控件將值作為方法調用中的參數,從綁定控件傳遞到源對象。源對象的數據檢索方法必須返回DataSet、DataTable或DataView對象,或者返回實現IEnumerable接口的對象。如果數據作為DataSet、DataTable或DataView對象返回,ObjectDataSource控件便可以緩存和篩選這些數據。如果源對象接受ObjectDataSource控件中的頁面大小和記錄索引信息,則可以實現高級分頁的解決方案。
通常它作為數據綁定控件(如GridView、FormView或DetailsView控件)的數據接口,使這些控件在ASP.NET網頁上顯示和編輯中間層業務對象中的數據。對于大多數ASP.NET數據源控件,如SqlDataSource,都在兩層應用程序層次結構中使用。在該層次結構中,表示層(ASP.NET網頁)可以與數據層(數據庫和XML文件等)直接進行通信。但是,常用的應用程序設計原則是,將表示層與業務邏輯相分離,而將業務邏輯封裝在業務對象中。這些業務對象在表示層和數據層之間形成一層,從而生成一種三層應用程序結構。而ObjectDataSource控件通過提供一種將相關頁上的數據控件綁定到中間層業務對象的方法,為三層結構提供支持。這樣在不使用擴展代碼的情況下,使用中間層業務對象以聲明方式對數據執行選擇、插入、更新、刪除、分頁、排序、緩存和篩選操作。其原理是通過使用反射調用業務對象的方法,來對數據執行選擇、更新、插入和刪除操作。
2.SqlDataSource控件
SqlDataSource控件使用SQL命令來檢索和修改數據,可以用于Microsoft SQL Server、OLE DB、ODBC和Oracle數據庫。并將結果以DataReader或DataSet對象返回。當結果以DataSet返回時,該控件支持排序、篩選和緩存。使用Microsoft SQL Server時,該控件還有一個優點,那就是當數據庫發生更改時,SqlCacheDependency對象可使緩存結果無效。
它的一個特別之處在于,可以在ASP.NET頁中直接訪問和操作數據,而無須直接使用ADO.NET類。只需提供用于連接到數據庫的連接字符串,并定義使用數據的SQL語句或存儲過程即可。在運行時,它會自動打開數據庫連接,執行SQL語句或存儲過程,返回選定數據(如果有),然后關閉連接。
3.LinqDataSource控件
<asp:LinqDataSource>控件是一個實現了在ASP.NET 2.0中介紹的DataSourceControl。它和ObjectDataSource和SqlDataSource控件很類似,可以顯式地將頁面上的其他控件綁定到一個數據源。不同的是,它不是直接綁定到數據庫(像SQL DataSource)或者到一個類(像ObjectDataSource),它綁定到一個使用了LINQ的數據模型。使用<asp:LinqdataSource>的一個好處就是增加了基于ORMs支持的LINQ的靈活性。不需要自己去定義讓數據源來調用的Query/Insert/Update/Delete方法,僅僅需要將該控件指向你的數據模型即可,并指明你想操作的是哪張表,然后就可以將任何的ASP.NET UI控件綁定到它,使其和<asp:LinqDataSource>一起運行。
4.AccessDataSource控件
AccessDataSource控件是SqlDataSource控件的專用版本,專為使用Microsoft Access .mdb文件而設計。與SqlDataSource控件一樣,可以使用SQL語句來定義控件獲取和檢索數據的方式。它繼承了SqlDataSource類并用DataFile屬性替換了ConnectionString屬性,這樣更便于連接到Microsoft Access數據庫,并使用System.Data.OleDb提供程序連接到使用Microsoft.Jet.OLEDB.4.0 OLE DB提供程序的Access數據庫。在使用時,讀者可以將DataFile屬性設置為指向Access數據庫文件的通用命名約定(UNC)路徑。下面的示例演示如何使用根相對路徑標識位于當前Web應用程序的App Data文件夾中的Access數據庫。
<asp:AccessDataSource id="AccessDataSource1" DataFile="~/App_Data/Northwind.mdb" runat="server" SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees"> </asp:AccessDataSource>
注意 AccessDataSource不會連接到受密碼保護的Access數據庫;要從受密碼保護的Access數據庫中檢索數據,請使用SqlDataSource控件。
5.XmlDataSource控件
XmlDataSource控件可以讀取和寫入XML數據,因此你可以通過某些控件(如TreeView和Menu控件)來使用該控件。XmlDataSource控件可以讀取XML文件或XML字符串。如果該控件處理XML文件,它可以將修改后的XML寫回到源文件。如果存在描述數據的架構,XmlDataSource控件可以使用該架構來公開那些使用類型化成員的數據??梢詫ML數據應用XSLT轉換,將來自XML文件的原始數據重新組織成更加適合要綁定到XML數據的控件的格式。還可以對XML數據應用XPath表達式,該表達式允許篩選XML數據以便只返回XML樹中的特定節點,或查找具有特定值的節點等。如果使用XPath表達式,將禁用插入新數據的功能。
XmlDataSource從使用DataFile屬性指定的XML文件加載XML數據。另外,還可以從使用Data屬性的字符串加載XML數據。它將XML元素的屬性公開為可綁定數據的字段。如果要綁定非屬性的值,則可以使用可擴展樣式表語言(XSL)樣式表指定轉換。在FormView或GridView等控件模板中,讀者還可以使用XPath數據綁定功能將模板中的控件綁定到XML數據。
下面的代碼示例演示一個XmlDataSource和綁定到它的一個TreeView控件:
<asp:XmlDataSource id="WorkerDataSource runat="server" DataFile="~/App_Data/XMLFile.xml" /> <asp:TreeView id="WorkerTreeView" runat="server" DataSourceID="WorkerDataSource"> <DataBindings> <asp:TreeNodeBinding DataMember="UserName" TextField="#InnerText" /> <asp:TreeNodeBinding DataMember="Title" TextField="#InnerText" /> <asp:TreeNodeBinding DataMember="Description" TextField="#InnerText" /> </DataBindings> </asp:TreeView>
代碼示例所使用的XML數據如下:
<?xml version="1.0" encoding="utf-8" ?> <Worker> <User> <Name> <UserName>kimluo</UserName> </Name> <Job> <Title>.NET Developer</Title> <Description>C#,ASP.NET</Description> </Job> </User> </Worker>
注意 建議在啟用了客戶端模擬并且根據客戶端標識檢索XmlDataSource控件的源文件時,將EnableCaching屬性設置為false。如果啟用了緩存,則單個用戶的緩存XML數據會被所有用戶看到,并且敏感信息可能會公開給有害源。如果identity配置元素的impersonate屬性設置為true且對Web服務器上的應用程序禁用匿名標識,則說明啟用了客戶端模擬。
6.SiteMapDataSource控件
SiteMapDataSource控件使用ASP.NET站點地圖,并提供站點導航數據。此控件通常與Menu控件一起使用。當通過并非專為導航而設計的Web服務器控件(如TreeView或DropDownList控件)來實現站點地圖數據自定義站點導航時,此控件也很有用。
它從站點地圖提供程序(例如XmlSiteMapProvider,它是ASP.NET的默認站點地圖提供程序)檢索站點地圖數據。讀者可以將其配置為返回站點地圖節點的全集或子集。如果需要在一頁上顯示多個導航結構并且每個導航結構顯示單獨的站點地圖部分,這非常有用。如果需要將站點導航元素分布在站點中不同的母版頁上并且每個母版頁顯示整個站點地圖的不同部分,這也非常有用。若要使用這些站點導航控件,就必須在Web.sitemap文件中描述站點的結構,并創建在站點地圖中列出的.aspx文件。向網頁添加站點導航的代碼片段如下:
<h2>Using SiteMapPath</h2> <asp:SiteMapPath ID="SiteMapPath1" Runat="server"> </asp:SiteMapPath> <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" /> <h2>Using TreeView</h2> <asp:TreeView ID="TreeView1" Runat="Server" DataSourceID="SiteMapDataSource1"> </asp:TreeView> <h2>Using Menu</h2> <asp:Menu ID="Menu2" Runat="server" DataSourceID="SiteMapDataSource1"> </asp:Menu> <h2>Using a Horizontal Menu</h2> <asp:Menu ID="Menu1" Runat="server" DataSourceID="SiteMapDataSource1" Orientation="Horizontal" StaticDisplayLevels="2" > </asp:Menu>
小提示 如果起始節點的嵌套深度比站點地圖的根節點深,則可以將StartingNodeOffset屬性設置為一個負數。當StartFromCurrentNode屬性設置為true且想要從當前節點的父節點開始顯示站點地圖時,這往往很有用。