深入剖析微软ASP.NET Ajax中的数据绑定架构上篇之一(
![]() |
| 图1:ASP.NET AJAX架构图 |
◆ASP.NET AJAX Control Toolkit(在前面的图1没有指出),这个包中提供了大量现成的例子并包含一个功能相当强大的SDK,其目的是进一步简化创建定制的ASP.NET AJAX控件及扩展器;
◆ASP.NET AJAX Futures January CTP(最近又刚发行了一个五月版,但本文中的所有概念及例子照样通用),这一部分对应于程序集Microsoft.Web.Preview.dll(包 含三个文件—PreviewScript.js,PreviewGlitz.js和PreviewDragDrop.js)。
![]() |
| 图2:基础类库中的组件 |
![]() |
| 图3:MS AJAX客户端数据源控件与其ADO.NET 2.0对应物间的比较 |
![]() |
| 图4:MS AJAX主要数据绑定控件间的层次关系图 |
|
Sys.Preview.Data.DataSource.prototype = {
_data: null, _initialData: null, _autoLoad: false, _serviceURL: "", _loadMethod: "", _serviceType: Sys.Preview.Data.ServiceType.DataService, _isReady: true, _dataChangedDelegate: null, _request: null, _timeout: 0, //……omitted _onDataAvailable: Sys$Preview$Data$DataSource$_onDataAvailable, get_data: Sys$Preview$Data$DataSource$get_data, set_data: Sys$Preview$Data$DataSource$set_data, get_initialData: Sys$Preview$Data$DataSource$get_initialData, set_initialData: Sys$Preview$Data$DataSource$set_initialData, get_isDirtyAndReady: Sys$Preview$Data$DataSource$get_isDirtyAndReady, get_isReady: Sys$Preview$Data$DataSource$get_isReady, _set_isReady: Sys$Preview$Data$DataSource$_set_isReady, get_loadMethod: Sys$Preview$Data$DataSource$get_loadMethod, set_loadMethod: Sys$Preview$Data$DataSource$set_loadMethod, get_parameters: Sys$Preview$Data$DataSource$get_parameters, get_serviceURL: Sys$Preview$Data$DataSource$get_serviceURL, set_serviceURL: Sys$Preview$Data$DataSource$set_serviceURL, get_serviceType: Sys$Preview$Data$DataSource$get_serviceType, set_serviceType: Sys$Preview$Data$DataSource$set_serviceType, get_rowCount: Sys$Preview$Data$DataSource$get_rowCount, initialize: Sys$Preview$Data$DataSource$initialize, onDataPropertyChanged: Sys$Preview$Data$DataSource$onDataPropertyChanged, onRequestComplete: Sys$Preview$Data$DataSource$onRequestComplete, onLoadComplete: Sys$Preview$Data$DataSource$onLoadComplete, ready: Sys$Preview$Data$DataSource$ready, load: Sys$Preview$Data$DataSource$load, save: Sys$Preview$Data$DataSource$save } Sys.Preview.Data.DataSource.descriptor = { properties: [ { name: 'data', type: Object }, { name: 'autoLoad', type: Boolean }, { name: 'initialData', type: String }, { name: 'isDirtyAndReady', type: Boolean, readOnly: true }, { name: 'isReady', type: Boolean, readOnly: true }, { name: 'loadMethod', type: String }, { name: 'rowCount', type: Number, readOnly: true }, { name: 'serviceURL', type: String }, { name: 'parameters', type: Object, readOnly: true }, { name: 'serviceType', type: Sys.Preview.Data.ServiceType } ], methods: [ { name: 'load' }, { name: 'save' } ], events: [ { name: 'dataAvailable', readOnly: true } ] } Sys.Preview.Data.DataSource.registerClass('Sys.Preview.Data.DataSource', Sys.Component); |
|
<components>
<dataSource id="listsDataSource" serviceURL="TaskListDataService.asmx" /> <dataSource id="itemsDataSource" serviceURL="TaskItemDataService.asmx"> <dataAvailable> <invokeMethodAction target="listsDataSource" method="load" /> </dataAvailable> </dataSource> |
|
方法名
|
描述
|
|
load
|
从服务器端检索数据(根据当前
DataSource
的配置对服务器端进行查询)。
|
|
Save
|
根据当前
DataSource
的配置,显式地把数据写向或更新到服务器端—也即是把客户端所作改变保存回服务器。
|
|
function Sys$Preview$Data$DataSource$save() {
//……省略 if (this._serviceType === Sys.Preview.Data.ServiceType.DataService) { var method = "SaveData"; var params = {changeList: changes, parameters: this._parameters,
loadMethod: this._loadMethod};
var onComplete = Function.createDelegate(this, this.onLoadComplete); var onError = Function.createDelegate(this, this.ready);
this._request = Sys.Net.WebServiceProxy.invoke(this._serviceURL,
method, false, params, onComplete, onError, this, this._timeout);
} else { throw Error.createError("Save is not supported in Handler mode."); } |
|
属性名
|
描述
|
|
autoLoad
|
Boolean
值,用于指明是否这个数据源控件在初始化后将自动地从服务器端加载数据。注意,如果你想在页面加载时就应该指定数据源的内容,则应使用
initialData
属性;否则的话,在页面加载后,还需要一次到服务器端的信息馈送。
|
|
initialData
|
伴随页面的加载提供的初始数据。有些场所下,当用户第一次进入页面时就应该在页面中显示一些初始的数据—例如某个列表的第一页的记录。
|
|
isDirtyAndReady
|
指示是否当前
DataSource
已经完成数据加载,并且数据非空,且数据没有发生改变。
|
|
loadMethod
|
另一个有些“神秘”的方法(我们将在下篇的关于
DataService
处讨论它)。
|
|
rowCount
|
返回
data
属性中实际数据的行数。
|
|
serviceURL
|
Web
服务的
URL
,
DataSource
可以从中检索数据。注意,你应该总是设置这个属性。
|
|
parameters
|
添加到服务
URL
后的参数。仅用于当
serviceType
的类型设置为
handler
时。
|
|
serviceType
|
用于指定
web
服务的类型,可以被设置为
DataService
或
handler
。缺省情况下(也是推荐的)值为
DataService
,这意味着你的服务要派生自
Microsoft.Web.Services.DataService
并且应该为典型的数据库
CRUD
操作提供内置的支持。
|
|
Id
(定义于父类中)
|
控件标识。
|
|
data
|
检索自服务器端数据库中的数据,存储于客户端。注意:这个属性仅可以为Array类型或Sys.Preview.Data.DataTable类型。
|
|
isReady
|
指示是否这个DataSource已经完成从服务器加载数据。你可以把这个属性绑定到一个数据绑定控件的enabled属性上,以便当数据正处于加载过程时禁止使用此绑定控件。
|
|
属性名
|
描述
|
|
data
|
被修饰的实际数据,类型为
Sys.Data.IData
或
Sys.IArray
。
|
|
filteredData
|
过滤数据,例如分页数据或经排序的数据。
|
|
filters
|
一个
DataFilter
对象的集合,用于过滤数据。你可以为
DataView
指定一组过滤器并把它们逐个应用于你的数据。
|
|
hasNextPage
|
是否存在下一个页面。
|
|
hasPreviousPage
|
是否存在上一个页面。
|
|
length
|
在当前页面中有多少行。
|
|
pageCount
|
在当前
DataView
中有多少页。
|
|
pageIndex
|
当前页面索引。
|
|
pageSize
|
每一页中有多少行。如果你需要对你的数据进行分页,则应该设置这个属性。
|
|
sortColumn
|
排序记录行所依据的列。如果你需要排序,则应该设置这个属性。
|
|
sortDirection
|
排序的方向,或者是
Ascending
(缺省的值)或者是
Descending
。
|
|
事件名
|
描述
|
|
collectionChanged
|
当行集合改变时(例如添加,删除或者修改)调用。
|
|
propertyChanged
|
无论何时改变一个或多个属性时都被调用。
|
|
属性名
|
描述
|
|
columns
|
返回一个
Sys.Preview.Data.DataColumn
数组,类似于一个数据库表格的结构。
|
|
keyNames
|
返回一个字符串数组,用于描述
DataTable
中的关键字列。
|
|
length
|
返回
DataTable
中所有记录的总数。
|
|
isDirty
|
如果
DataTable
中的数据已经改变并且还没有被写回到数据库,那么,这个属性被置为
true
;否则为
false
。
|
|
方法名
|
描述
|
|
Delete
(
rowObject
)
|
从当前
DataTable
中删除一行(即对应作为参数的行)
|
|
get_length
()
|
返回记录总数
|
|
add
(
rowObject
)
|
在当前
DataTable
的最后添加一个新行
|
|
clear
()
|
删除当前
DataTable
中的所有数据
|
|
createRow
(
initialData
)
|
根据当前列结构创建一个新的
Sys.Preview.Data.DataRow
|
|
getChanges
()
|
返回针对当前
DataTable
的修改操作,返回值为下列之一:
·
Updated—最近更新的Sys.Preview.Data.DataRow;
·
inserted—新插入的Sys.Preview.Data.DataRow;
·
Deleted—新删除的Sys.Preview.Data.DataRow。
|
|
getColumn
(
name
)
|
根据传递的列名从该
DataTable
中返回一个
DataColumn
对象。
|
|
getRow
(
index
)
|
返回一个对象
DataRow
|
|
getItem
(
index
)
|
与方法
getRow相同
|



