Flex与DotNET WebService交互(2)
上篇讲了很简单的示例,但是有好多问题值得我们去深究一下,首先看下面的代码:
2 internal function onList(event:ResultEvent):void
3 {
4 employees = new ArrayCollection();
5 employees = event.result as ArrayCollection;
6 this.dgEmployees.dataProvider = employees;
7 }
里面有个event.result, 那么这个result到底是什么内容呢,我们需要在那一行加上断点,调试运行来看个究竟。打开Flex Builder中的Variables选项卡,可以看到如下的“大量有用信息”:
首先可以确定了event.result是mx.collections.ArrayCollection类型,里面的数据正是我们想要的,而且mx.collections.ArrayCollection是Flex中绑定数据很常用的类型。这个时候我们回过头来看一下上篇中生成的XML数据:
2 <ArrayOfEmployee
3 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
4 <Employee>
5 <Id>006</Id>
6 <Name>Aking</Name>
7 </Employee>
8 <Employee>
9 <Id>007</Id>
10 <Name>spoony</Name>
11 </Employee>
12 </ArrayOfEmployee>
13
仔细对比可以发现,XML数据中的类名称(Employee)在传到Flex端的时候被丢掉了。其实Flex并不关心WebService返回结果被序列化成什么内容,它直接访问的是WebService本身。即使不能成功序列化,照样可以访问。为了验证,下面再做一个实验。
首先在原来的WebService中添加一个返回类型为数组的新的WebMethod:
2 /// web method used to return array
3 /// </summary>
4 /// <returns></returns>
5 [WebMethod]
6 public Employee[] arrayEmployees()
7 {
8 Employee[] employees = new Employee[2];
9 employees[0] = new Employee("006", "Aking");
10 // To test the one-record-returned result, comment the following line.
11 employees[1] = new Employee("007", "spoony");
12 return employees;
13 }
运行,使用HTTP POST 协议测试,得到一个异常信息:System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidCastException: Unable to cast object of type 'ArrayCollectionorObjectProxy.Employee[]' to type 'System.Collections.Generic.List`1[ArrayCollectionorObjectProxy.Employee]'.
呵呵,转换失败,其实从这个错误中还可以进行一个设想,那就是无论你的WebMethod返回类型是什么,都要转化成System.Collections.Generic.List再进行序列化。这个具体笔者并没有深究。
接下来继续如上篇所讲用Flex访问这个新创建的WebMethod, 结果是event.result里的内容和上篇中用返回类型为List<T>是一样的,数据自然能正常显示。如下图:
上面主要是使用了List泛型来获取数据,自然现在泛型也是面向对象开发中主要使用的东西,其实DotNET里面集合类还有很多:System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合;System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能;System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。
在DotNET与Flex结合使用的时候需要看清楚这些不同返回类型的WebMethod到底在Flex端被转化成什么类型,然后再进行相应数据处理,就不会出现问题了。典型的例子是当数据只有一条记录时,很有可能会转化成mx.utils.OjbectProxy而非mx.collections.ArrayCollection.
人每天要做三件事,第一件是微笑,第二件是欢笑,第三件是大笑。