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控件可以使用该架构来公开那些使用类型化成员的数据。可以对XML数据应用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且想要从当前节点的父节点开始显示站点地图时,这往往很有用。