ASP.NET AJAX 4.0 Preview 3 (Part 1 - ADO.NET Data Service Client Library)

自从Microsoft与jQuery合作以来,ASP.NET AJAX与jQuery就被定位为两个互补的AJAX库。既然jQuery已经实现了如此多轻量级的AJAX特性,自然ASP.NET AJAX会继续专注于富客户端所需的一些重量级特性。

在ASP.NET AJAX 4.0 Preview 3里面,开发人员能够接触到的两个重要的新特性就是ADO.NET Data Service Client Library以及ASP.NET AJAX Template。对于熟悉ASP.NET服务器端开发但不熟悉客户端开发的人来说,你可以简单地把这两个特性理解为存在于客户端的DataSource以及ListView,只要把数据通过ADO.NET Data Service输出到前端,你就可以如同使用DataSource和ListView的组合一样在客户端开发数据驱动的应用程序了。

在这篇文章里,我们将来看看如何使用ADO.NET Data Service Client Library,将ADO.NET Data Service暴露的REST数据接口直接拿到客户端JavaScript代码中去调用。文章中所用到的示例代码,可以在这里下载:ASP.NET AJAX 4.0 Preview 3 Demo,然后参考里面的AdoNetDataServiceDemo.aspx。

服务器端准备工作

在我们接下来要讲到的示例当中,我们会用到一个SQL Server 2005 Express Edition的数据库,里面有一张名为OscarWinners的表,记录的是本年度奥斯卡获奖名单,字段包括AwardID、Award、Winner、Film。然后我们为这张表创建ADO.NET Entity Model,接着再为它生成的实体类创建ADO.NET Data Service。这些都是在Visual Studio 2008中点几下鼠标就能完成的操作,就不再详细解释了。在ADO.NET Data Service的InitializeService()方法内,我们仅仅给它提供一个最宽松的规则:

config.SetEntitySetAccessRule("*", EntitySetRights.All);

到这里,我们就把服务器端的要做的工作都准备好了。打开你创建的ADO.NET Data Service地址,看看是否输出了正确的Atom格式数据。如果没有,请检查一下你机器上的WCF是否已经正确安装和配置好了。确保服务器端的准备工作都做好了,然后再进入客户端的开发工作。

连接Data Service

在客户端使用ADO.NET Data Service,我们需要接触到的类只有一个,那就是Sys.Data.AdoNetServiceProxy。首先,我们要连接到ADO.NET Data Service,也就是使用ADO.NET Data Service的URL来实例化此类:

var dataService = new Sys.Data.AdoNetServiceProxy("WebDataService.svc");

然后,我们就可以利用dataService来调用ADO.NET Data Service进行CRUD操作了。

CRUD操作

所有的CRUD操作都在Sys.Data.AdoNetServiceProxy对象上执行,方法分别名为query()insert()update()remove()。在我们的示例当中,会用到query()update()方法,另外两个方法是用起来和update()很类似,就不再详细说明了。

查询操作

dataService.query("OscarWinners", function(result, context, operation) {
  /* display result */
}, errorHandler);

使用上述语句,我们查询出了OscarWinners表中的所有数据。随后的第一个回调函数会在查询成功时被调用,因此我们可以在其中编写拼接HTML以显示结果的逻辑,具体的代码请参考下载中的AdoNetDataServiceDemo.aspx。第二个回调函数会在查询失败时被调用,我们可以编写一个统一的错误处理函数,名为errorHandler,然后将它传递给此参数。

如果需要传递复杂的查询参数,使用ADO.NET Data Service的格式就可以了,这可以在MSDN上查到。例如说查询Slumdog Millionaire这部电影夺取了多少个奥斯卡奖项,然后把奖项按照名称排序输出,可以这样子写:

dataService.query("OscarWinners?$filter=Film eq 'Slumdog Millionaire'&$orderby=Award", function(result, context, operation) {
  /* display result */
}, errorHandler);

更新操作

dataService.update(item, function(result, context, operation) { }, errorHandler);

尽管将查询结果保存下来成为items集合,并且根据用户在界面上执行的操作修改item上的属性,这些逻辑都需要我们手动维护,然而最后将item更新到服务器上则只需要如此简单的一句调用。

在我给出的示例代码中,我自己写了一个InPlaceEditBehavior,也就是所谓的“就地编辑器”,能够让用户点击显示文本后把显示文本变成输入框。然后我把这个InPlaceEditBehavior绑定到每一条记录显示的Winner字段和Film字段的span上,使得这些span都能接收用户输入。最后,我为InPlaceEditBehavior添加了一个onchanged事件,并在该事件的处理函数中完成更新item以及调用update()的操作。

小结

在这篇文章里,我简单地介绍了ADO.NET Data Service Client Library的易用性,并且通过一个具体的示例说明了如何用它来节省大量的数据交互代码。

如果你曾经写过AJAX-Enabled WCF Service,你应该知道把实体类暴露为WCF Service接口是多么麻烦的事情,就算每个实体类就简单地支持CRUD方法,你也必须手动编写这4个方法。ADO.NET Data Service相当于帮你把这一切都做好了,只要给它实体类和规则,它就帮你生成一个Data Service。另外,通过AJAX-Enabled WCF Service所包括的数据接口,会自动生成一大堆客户端代理类,而ADO.NET Data Service Client Library则只有一个固定的代理类,客户端代码体积不会随着接口复杂度的增加而增加。

说了ADO.NET Data Service Client Library的那么多好处,那么这个示例中又有什么做得不够好的地方呢?我觉得最难维护的地方就是获取到数据后拼接HTML的代码了,人手写的HTML拼接代码难免容易出错,而且日后更新起来也很麻烦,出错了调试时也不容易定位问题。ASP.NET AJAX Template能够帮助我们解决这个问题,这就是下一篇文章中将会讲到的内容。

如果你不想错过接下来的文章,欢迎订阅我的博客,点击侧栏上的订阅链接就可以了。

你可能感兴趣的:(asp.net)