ASP.NET的XML数据


  本文标签:XML数据 ASP.NET

  将数据源控件绑定到XML数据的方法有两种:使用任意XML文档和使用DataSet对象的XML表示形式  。在前一种情况下,您可以使用分层的数据源控件 (XmlDataSource);而在后一种情况下,您可以使用表格式数据源组件(DataSetDataSource)  。可以通过URL (DataFile属性)或字符串(Data属性)来指定XML数据  。可以使用SchemaFile或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将数据存储区字段晚期绑定到对象属性,如下面的示例所示:

  1. <%# DataBinder.Eval(Container.DataItem, fieldName, formatString) %> 

  Container.DataItem表达式引用在其上计算该表达式的对象  。该表达式通常是一个字符串,该字符串具有要在数据项对象上访问的字段的名称  。通常,该表达式可以包含索引和属性名称  。这些常用代码可能频繁地在页面的同一表单中重复使用  。只有表达式和格式字符串各不相同  。ASP.NET 2.0支持经过简化的语法,如下面的代码片段所示:

  1. <%# Eval(fieldName, formatString) %> 

  当页面被编译以供使用时,会将Eval调用作为一个独立调用插入该页面的源代码中  。下面的代码可以使您了解实际发生的事情:

  1. 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控件这样的数据绑定控件  。对于该方案,也存在等效的简化语法:

  1. <asp:Repeater 
  2. runat="server" 
  3. DataSource=<%# XPathSelect("orders/order/summary") %> 
  4. > 
  5. ...  
  6. asp:Repeater> 

  XpathSelect是您在数据绑定表达式中使用的关键字,用于指示在容器对象上执行的XPath查询的结果  。如果该容器对象未实现IXPathNavigable,则会引发异常  。