【IT168专稿】我在以前的一篇专栏文章“集成jQuery,Web Service,Ajax和ASP.NET”中曾经介绍过,通过Ajax技术,可以在ASPX文件中实现无服务端代码,相反,只需要利用JavaScript,ASMX或WCF服务就可实现数据提取和更新,这是一种全新的Web应用程序开发模式,浏览器与一系列低带宽需求、专用Web服务实现异步交互取回网页,只有当用户准备跳转到另一个页面时,浏览器才会做一次传统的回发,这种反应快的应用程序对服务器和网络的要求更低。
本文将使用最新的Ajax库:dataView,dataContext和它们支持的数据绑定。在服务器端,我将使用.Net 4版本的WCF和实体框架(EF),不过我们应记住的是Ajax库是不依赖于.Net 4的,因此你可以在现有.Net 3.5应用程序上使用它,此外,你还可以使用ASMX Web Service。
微软的客户端策略一直在不断变化,现在对jQuery非常重视,但因对Ajax库的投入很少,尤其是在数据绑定、脚本装载器和模板方面,它总是停滞不前,如果你现在想在.Net中使用Ajax,或是想研究一下这些技术,可以多看看我们的专栏文章。
JSON问题
为了在我的WCF服务中生成最少的代码行,我尝试从WCF服务中返回实体框架对象,虽然诱人,但这个方法在当前的工具中不一定支持,EF实体可能不会以dataView或dataContext对象可以使用的方式返回客户端。
真正麻烦的问题是dataView和dataContext对象期望获得JSON序列化对象,但EF实体不能序列化到JSON对象。具体点说就是,如果你查看EF模型的代码文件,你会发现每个具有IsReference属性的实体类上的DataContract属性都被设为True,这个设置优先于JSON序列化。
围绕这个问题有两个解决办法,首先就是不返回EF实体,正如我在另一个专栏“从业务对象转换到用户界面对象”中介绍的那样,很可能你的实体对象与你的UI并不能完美匹配,因此在你的服务中,使用EF对象提取数据,要创建一组数据传输对象(Data Transfer Objects,DTO)来发送到客户端。在Visual Studio 2010中,向你的网站添加一个WCF服务时,如果你选择“启用Ajax的WCF服务”,Visual Studio将会为你生成所有的WCF配置条目。
只要你不在DTO的DataContract属性上犯错,一切都会顺利,如果你没有准备好WCF,你可能要使用一个ASMX Web Service。
WCF数据服务
另一个解决办法是使用WCF数据服务,WCF数据服务内置串行器,它可以让EF实体和JSON对象相互转换(这是微软OData策略的一部分),唯一的障碍是WCF数据服务是基于REST的,不是基于SOAP的,因此获得实体的语法不是以调用方法为基础的,.Net 4的WCF数据服务更简单了。