ObjectDataSource 是 ASP.NET 数据源控件,用于向数据绑定控件表示识别数据的中间层对象或数据接口对象。可以结合使用 ObjectDataSource 控件与数据绑定控件,这样,只用少量代码或不用代码就可以在网页上显示、编辑和排序数据。
非常常见的应用程序设计做法是将表示层同业务逻辑分开,并在业务对象中封装业务逻辑。这些业务对象在表示层和数据层之间构成一个独特的层,从而得到一个三层应用程序结构。ObjectDataSource 控件使开发人员能够在保留他们的三层应用程序结构的同时,使用 ASP.NET 数据源控件。
ObjectDataSource 控件使用反射创建业务对象的实例,并调用这些实例的方法以检索、更新、插入和删除数据。TypeName 属性标识 ObjectDataSource 使用的类的名称。ObjectDataSource 控件在每次调用方法时都创建并销毁类的实例,它在 Web 请求的生存期内不在内存中保留对象。如果您使用的业务对象需要很多资源或者在其他方面需要很大开销来创建和销毁,您就需要认真考虑。使用高开销对象可能并不是最佳的设计选择,但是可以使用 ObjectCreating、ObjectCreated 和 ObjectDisposing 事件来控制该对象的生存期。
若要从业务对象中检索数据,请用检索数据的方法的名称设置 SelectMethod 属性。如果此方法未返回 IEnumerable 或 DataSet 对象,则运行时在 IEnumerable 集合中包装该对象。如果方法签名带参数,您可以将 Parameter 对象添加到 SelectParameters 集合,然后将它们绑定到要传递给由 SelectMethod 方法指定的方法的值。为使 ObjectDataSource 能够使用参数,这些参数必须与方法签名中的参数名称和类型相匹配。
每次调用 Select 方法时,ObjectDataSource 控件都检索数据。此方法提供对 SelectMethod 属性所指定的方法的编程访问。当调用绑定到 ObjectDataSource 的控件的 DataBind 方法时,这些控件自动调用 SelectMethod 属性指定的方法。如果设置数据绑定控件的 DataSourceID 属性,该控件根据需要自动绑定到数据源中的数据。建议通过设置 DataSourceID 属性将 ObjectDataSource 控件绑定到数据绑定控件。或者,可以设置 DataSource 属性,但之后必须显式调用数据绑定控件的 DataBind 方法。可以随时以编程方式调用 Select 方法以检索数据。
有关将数据绑定控件绑定到数据源控件的更多信息,请参见 使用数据源控件绑定到数据。
根据 ObjectDataSource 控件使用的业务对象的功能,可以执行数据操作,如更新、插入和删除。若要执行这些数据操作,请为要执行的操作设置适当的方法名称和任何关联的参数。例如,对于更新操作,将 UpdateMethod 属性设置为业务对象方法的名称,该方法执行更新并将所需的任何参数添加到 UpdateParameters 集合中。如果 ObjectDataSource 控件与数据绑定控件相关联,则由数据绑定控件添加参数。这种情况下,需要确保方法的参数名称与数据绑定控件中的字段名称相匹配。调用 Update 方法时,由代码显式执行更新或由数据绑定控件自动执行更新。Delete 和 Insert 操作遵循相同的常规模式。假定业务对象以逐个记录(而不是以批处理)的方式执行这些类型的数据操作。
如果数据作为 DataSet、DataView 或 DataTable 对象返回,ObjectDataSource 控件可以筛选由 SelectMethod 属性检索的数据。ObjectDataSource 控件允许缓存所有类型的数据,但您不应缓存那些保留不能被共享以服务于多个请求的资源或状态的对象(例如,打开的 SqlDataReader 对象),因为对象的此实例将用于服务多个请求。您可以使用格式字符串语法将 FilterExpression 属性设置为筛选表达式,并将表达式中的值绑定到 FilterParameters 集合中指定的参数。
尽管 ObjectDataSource 不在多个请求之间保留业务对象的实例,但它可以缓存 SelectMethod 方法的结果。缓存数据时,对 Select 方法的后续调用将返回缓存的数据,而不是创建业务对象并使用反射来调用该对象的 SelectMethod。缓存可避免以 Web 服务器内存开销的代价创建对象和调用对象的数据方法;这可能是一个好的折中方法。当 EnableCaching 属性设置为 true 且 CacheDuration 属性设置为在丢弃缓存前缓存存储数据的秒数时,ObjectDataSource 将自动缓存数据。也可以指定 CacheExpirationPolicy 属性和可选的 SqlCacheDependency 属性。
下表描述 ObjectDataSource 控件的功能。
| 功能 | 要求 |
| 选择 | 将 SelectMethod 属性设置为业务对象方法的名称,该方法选择数据并以编程方式或使用数据绑定控件,在 SelectParameters 集合中包含所有必需的参数。 |
| 排序 | 将 SortParameterName 属性设置为带有排序条件的 SelectMethod 方法中的参数名称。 |
| 筛选 | 将 FilterExpression 属性设置为一个筛选表达式,并选择将任何参数添加到 FilterParameters 集合中,以在调用 Select 方法时筛选数据。SelectMethod 属性指定的方法必须返回 DataSet、DataView 或 DataTable。 |
| 分页 | 如果 SelectMethod 方法包含要检索的最大记录数的参数和要检索的第一个记录的索引参数,则支持数据源分页。必须分别在 MaximumRowsParameterName 和 StartRowIndexParameterName 属性中设置那些参数的名称。即使 ObjectDataSource 控件不支持直接在 SelectMethod 属性指定的方法中分页,数据绑定控件自己也可能能够执行分页。要使数据绑定控件能够执行分页,SelectMethod 属性指定的方法必须返回一个实现 Icollection 接口的对象。 |
| 更新 | 将 UpdateMethod 属性设置为业务对象方法的名称,该方法更新数据并在 UpdateParameters 集合中包含所有必需的参数。 |
| 删除 | 将 DeleteMethod 属性设置为业务对象方法或函数的名称,该方法或函数删除数据并在 DeleteParameters 集合中包含所有必需的参数。 |
| 插入 | 将 InsertMethod 属性设置为业务对象方法或函数的名称,该方法或函数插入数据并在 InsertParameters 集合中包含所有必需的参数。 |
| 缓存 | 根据缓存数据的缓存行为,将 EnableCaching 属性设置为 true,并设置 CacheDuration 和 CacheExpirationPolicy 属性。 |
与所有数据源控件一样,ObjectDataSource 控件与数据源视图类关联。ObjectDataSource 控件是页面开发人员用来使用数据的接口,而 ObjectDataSourceView 类是数据绑定控件使用的接口。此外,ObjectDataSourceView 类描述数据源控件的功能并执行实际的工作。ObjectDataSource 控件仅有一个关联的 ObjectDataSourceView,而且它始终命名为 DefaultView。虽然 ObjectDataSourceView 对象由 GetView 方法公开,但它的许多属性和方法都是直接由 ObjectDataSource 控件包装和公开的。在后台,ObjectDataSourceView 对象执行所有数据操作,包括检索、插入、更新、删除、筛选和排序数据。有关更多信息,请参见 ObjectDataSourceView。
ObjectDataSource 控件没有可视呈现,它是作为控件实现的,以便您可以以声明方式创建它,还可以选择让它参与状态管理。因此,ObjectDataSource 不支持可视功能,如 EnableTheming 或 SkinID 属性。