• 1. ASP.NET数据绑定技术 ASP.NET具有强大的数据绑定功能,所谓的数据绑定是指数据与控件如何相互结合的方式。在ASP.NET中,开发人员可以选择性的绑定到简单的属性、集合、表达式或者是方法。本章将讨论ASP.NET数据绑定的几种方式,并深入的介绍ASP.NET中的功能强大的数据绑定控件。
  • 2. 1 绑定技术基础数据绑定允许开发人员将一个数据源和一个服务器端控件进行关联,免除了手工编写代码进行数据显示的痛苦。在ASP.NET中,开发人员可以使用声明式的语法对控件进行数据的绑定,而且大多数服务器控件都提供了对数据绑定的支持。根据所绑定的控件的不同或者是所需要绑定的属性的不同,ASP.NET中的数据绑定又可分为单值数据绑定与列表数据绑定。如果需要,开发人员还可定义自己的绑定。
  • 3. 1.1 单值绑定单值数据绑定允许为控件的某个属性指定一个绑定表达式,可以在声明代码中直接使用绑定表达式进行绑定。单值绑定通常使用如下的语法来指定数据绑定表达式: <%# 数据绑定表达式 %> 使用数据绑定并不只限于绑定到数据库中的数据,可以是一个变量,一个表达式或者是一个函数,都可以在表达式中进行指定。但是必须注意,如果绑定类级别的变量或者是函数,必须指定其访问级别为public或者是protected类型。 下面新建一个名为DataBinding的ASP.NET网站,在该网站中添加一个名为SingleValueBinding.aspx的网页。在该页面中放一个Label控件,然后使用数据绑定表达式将Label控件的Text属性绑定到当前的日期,声明代码如下所示: >
  • 4. 1.2 重复值绑定在介绍ADO.NET时,曾经不只一次的将SqlDataReader记录绑定到DropDownList或者是ListBox控件,当绑定到这两种控件后,可以看到并不是只显示了一个单值,而是显示了一个列表,这种绑定方式称为重复值绑定。 ASP.NET 3.5的ListBox、DropDownList、CheckBoxList和RadioButtonList这几个列表控件支持列表数据源,但是在同一时刻只能显示单一的属性值在列表中。除此之外,ASP.NET还提供了另外一些功能强大的重复值绑定控件,比如GridView、DetailsView和FormView等等,这些控件可以绑定到集合中的多个值或所有值。重复值数据绑定控件通常具有如图所示的属性,用来绑定的数据源。重复值绑定控件的数据绑定属性 属性说明DataSource包含要显示的数据的数据对象,该对象必须实现ASP.NET数据绑定支持的集合,通常是ICollection。DataSourceID使用该属性连接到一个数据源控件,使开发人员能用声明式编程而不用编写程序代码,本章后面的内容将介绍数据源控件。DataTextField指定列表控件将显示为控件文本的值,数据源集合通常包括多个列或者多个属性,使用DataTextField属性可以指定哪一列或属性数据进行显示。DataTextformatString指定DataTextValue属性将显示的格式。DataValueField该属性与DataTextField属性类似,但是该属性的值是不可见的,可以使用代码对该属性的值进行访问,比如列表控件的SelectedValue属性。
  • 5. 2 数据源控件在开发ASP.NET应用程序时,可以直接使用ADO.NET访问数据库,获取数据源并绑定到ASP.NET服务器控件,这个过程需要开发人员编写大量的程序代码,ASP.NET2.0以后,提供了一系列的数据源控件,采用声明式编程的方式指定数据源,大大简化了编写ASP.NET数据库应用程序的复杂性。ASP.NET 3.5中包括如下六种数据源控件: SqlDataSource控件:允许开发人员连接到任何具有ADO.NET提供者的数据源,包括SQL Server、Oracle和OLE DB以及ODBC数据源。 LinqDataSource控件:提供语言集成查询(LINQ To SQL)数据源。 ObjectDatasource控件:该数据源允许连接到一个自定义的数据访问类,对于大型可伸缩性应用程序使用ObjectDataSource是一个较好的办法。 AccessDataSource控件:读取写入Access数据库文件(.mdb)。 XmlDataSource控件:允许连接到XML文件,提供XML文件的层次结构信息。 SiteMapDataSource控件:连接到站点地图文件。
  • 6. 2.1 数据绑定的页面生存周期当使用ADO.NET编写代码绑定到数据源时,可以控制绑定的时机,如果使用DataSource控件后,了解一下数据绑定的页面生存周期是很有必要的。数据源控件能完成两个关键任务: 向连接控制提供数据源数据。 向数据源更新在控件中所做的更改。 为了理解数据控件如何工作,需要理解数据源控件在页面中的生命周期,当使用数据源控件或者是需要扩展数据绑定模型时是非常重要的。数据绑定控件的产生顺序如下所示: (1)创建page对象。 (2)开始页面生命周期,Page.Init和Page.Load事件触发。 (3)所有控件事件触发。 (4)如果数据源控件中有任何更新,则完成更新行为,并触发数据源控件的Updating 和Updated事件。如果有插入新行,则触发Inserting和Inserted事件。如果有删除行,则触发Deleting和Deleted事件。 (5)Page.PreRender事件触发。 (6)数据源控件完成查询,并且将查询数据发送到相连接的控件中。 (7)页面输出完成并被释放。
  • 7. 2.2 SqlDataSource控件SqlDataSource控件与 ADO.NET集成紧密,该控件将调用ADO.NET中的类来访问数据库,获取数据以及更新数据库。使用SqlDatasource可以访问SQL Server、SQL Express、Access、Oracle、DB2以及MySQL等数据源,只要这些数据源具有ADO.NET的提供程序。SqlDataSource简化了ADO.NET中访问数据库必须编写很多代码的繁琐,该控件以一种声明性的方式来定义数据访问,大大简化了ASP.NET开发人员的工作。使用SqlDataSource控件通常分为如下几个方面: (1)连接数据源。 (2)执行SQL命令。 (3)指定SQL参数。 (4)编程控制SqlDataSource控件。 (5)使用控件内置的缓存机制缓存数据。
  • 8. 2.3 使用参数过滤数据应用程序通常需要跟据用户的响应来动态的组建SQL查询,比如在产品数据表中,可能需要跟据用户的选择只查询指定产品ID的信息。再或者应用程序需要一个主从表式表格,根据用户在主表中的选择动态的显示从表中与主表相关的记录。SqlDataSource提供了多种类型的命令参数,解放了开发人员创建这类应用时的复杂性,使开发人员同样可以通过声明的方式来创建动态查询。 Parameters是所有参数对象的基类,该对象具有如下几个属性: ConvertEmptyStringToNull:布尔值,如果设为true,在SQL执行前,如果参数为空则被转换为null。 DefaultValue:参数的默认值,如果参数为空(null),则使用DefaultValue定义的值。 Direction:指定参数的方向,可选值有:Input、InputOutput、Output和ReturnValue。 Name:指定参数的名称,当使用ASP.NET参数时不要使用@字符。 Size:参数的大小。 Type:指定参数的.NET Framework类型。
  • 9. 2.4 更新数据和并发处理SqlDataSource具有四个Command属性,分别是:SelectCommand、InsertCommand、UpdateCommand和DeleteCommand,这四个属性都是DbCommand类型的对象,因此将具有CommandText、CommandType等等,可以使用这四个语句执行SQL命令或者是存储过程来完成查询、新增、更新和删除的动作。 VS2008提供了一个设计时窗口,如果为SelectCommand指定了一个SQL语句,VS2008能够根据Select语句中的字段动态的生成Insert、Update和DeleteCommand命令,当开发人员在配置Select语句窗口中单击高级按钮后,将会弹出如图所示的窗口。
  • 10. 2.5 编程执行SqlDataSource命令本节将介绍如何以编程的方式控制SqlDataSource控件,尽管SqlDataSource控件的声明方式己经能够完成大量复杂的工作,但是在一些情况下仍然需要更精细的控制SqlDataSource的运行。SqlDataSource提供了大量的事件和方法,可供编程时调用,当用户在选择、插入、更新以及删除前后都提供了事件处理,如下所示: Selecting:在查询之前触发。 Selected:在查询之后触发。 Inserting:在插入之前触发。 Inserted:在插入之后触发。 Updating:在更新之前触发。 Updated:在更新之后触发。 Deleting:在删除之前触发。 Deleted:在删除之后触发。
  • 11. 2.6 ObjectDataSource控件简介使用SqlDataSource控件声明式的与数据库进行访问非常简单,但是有很多缺陷,一个主要的问题是SqlDataSource与UI层过于紧密,造成以后的维护和修改的因难。ASP.NET提供了另外一个功能强大的数据源控件ObjectDataSource,该控件并不是直接与数据库进行绑定,而是绑定到一个业务对象上。 设计大中型应用程序通常需要清晰的层次结构,比如将表示层与业务逻辑相分离,而将业务逻辑封装在业务对象中。这些业务对象在表示层和数据层之间形成一层,从而生成一种三层应用程序结构。ObjectDataSource 控件通过提供一种将页上的数据控件绑定到中间层业务对象的方法,为三层结构提供支持。在不使用扩展代码的情况下,ObjectDataSource 使用中间层业务对象以声明方式对数据执行选择、插入、更新、删除、分页、排序、缓存和筛选操作,使用ObjectDataSource对象的三层结构示意如图14.14所示。
  • 12. 2.7 创建业务对象类下面新建一个名为ObjectDataSourceDemo.aspx的页面,本示例将使用ObjectDataSource控件来添加、删除以及更新Northwind数据库中的Products表数据。 (1)在ObjectDataSourceDemo.aspx设计视图中放一个GridView控件和一个ObjectDataSource控件。 (2)新建一个名为Products的类,使用上述的几条原则来设计一个业务类,由于需要从数据库中提取数据,因此该类将会调用ADO.NET中的类来从数据库中提取产品数据。 (3)从工具箱中拖一个ObjectDataSource控件到设计视图,在弹出的任务窗口中选择“配置数据源”菜单项,在选择业务对象下拉列表框中选择Products对象,接下来在定义数据方法中,可以选择四个方法,如图
  • 13. 2.8 在ObjectDatasource中使用参数本小节将创建一个根据指定的产品分类进行过滤的功能,首先在页面上添加一个DropDownList 控件,根据上一小节的讨论创建一个名为Categories的业务类,并绑定到DropDownList控件中。Categories代码如下所示:
  • 14. 2.9 使用ObjectDataSource更新数据要更新数据,同样需要在业务对象中定义更新的方法,在具体的编写代码之前,先介绍ObjectDataSource控件的一个非常有用的属性DataObjectTypeName。ObjectTypeName中性获取或设置某个类的名称,将该类用于更新、插入或删除数据操作中的参数,而不是从数据绑定控件传递个别的值。也就是说,在编写更新、插入方法时,不用为Products表中一个一个的指定参数,可能直接指定一个具有与Products表中相对应的公共属性的类即可。下面将为Products类添加一个Update方法,该方法用于更新Products数据表,代码如下所示:
  • 15. 2.10 LinqDataSource数据源简介.NET Framework3.5中引入了功能强大的LINQ特性,该特性又可以分为LINQ to Object、LINQ to SQL、LINQ to XML以及一些其他类型的LINQ to xx。其中LINQ To SQL是最重要的一个特性,LINQ To SQL在数据库的表和对象之间建立一个映射,开发人员对映射的对象进行操作,而不用关心底层的实现细节。LINQ可以使用C#或VB.NET编写实体类的查询,这些操作将被映射为相应的底层SQL操作,用户完全不用担心异构数据源的差异,本书后面的章节将专门讨论该技术。 ASP.NET 3.5中引入了另外一个功能强大的LinqDataSource控件,该控件的用法与其他两个控件的使用方式相似,但是LinqDataSource控件将从语言集成查询中获取数据源,当与数据库中的数据进行交互时,不会将LinqDataSource控件直接连接到数据库,而是与表示数据库和表的实体类进行交互。
  • 16. 2.11 使用LinqDataSource更新数据要为Products表添加插入、更新、删除的功能非常简单,只需要在LinqDataSource控件中选中启用插入、启用更新和启用删除三个复选框即可,从声明代码中可以看到VS2008自动添加了三个属性,代码如下所示:
  • 17. 3 小结本章介绍了ASP.NET3.5中的数据绑定技术,首先介绍了ASP.NET中的单值数据绑定和重复值数据绑定,接下来介绍了三种数据源控件SqlDataSource、ObjectDataSource和LinqDataSource控件。对于每个控件,本章都举了读取Northwind数据表中Products表的例子,相信对于这一章的学习,能够熟知数据源控件的使用。 灵活使用数据源控件在开发ASP.NET应用程序中是非常重要的,本章涉及的内容只能说是非常粗略的一部分。MSDN中具有详实和丰富的示例讲解这三个控件的使用,希望在阅读完本章的内容后再将MSDN中的相关的内容仔细的阅读一遍,以达到增强效果。