數組可能是各種語言中最常見的一種資料類型了。下面我們來看一看在Flash與ws互動時如何處理數組(或者“近似”數組的資料類型)。
還是讓我們藉著對sample2.asmx.cs修修補補吧:在sample2.asmx.cs中增加一個web方法:
[WebMethod]
public string[] GetArray_1(){
string[] strArr={"喬狗","劉鵬","陳波","張成平","費明","陳剛"};
return strArr;
}
該方法返回一個字串數組,編譯之,在flash的web服務視窗中可以看到此圖片僅顯示局部,請點擊查看完整圖片
該方法返回的資料類型。
下面讓我們在AS指令碼中處理接受過來的資料:
function GetArray_1(result){
trace("ws方法GetArray_1返回的值為:");
trace("/////////////////////////");
for (var i=0;i<result.length;i++){
trace(i+":"+result[ i ]);
}
}
咳!和本地處理數組一點區別都沒有。
實際上,在.net中我們對原始Array資料型用的不多。更多的是使用System.Collections命名空間中的一些較“進階”的資料類型:ArrayList、Hashtable、HybridDictionary等等。在ws+flash互動中,他們的處理和數組類似,不過,在flash也提供了一些複雜的類、API讓我們更簡單方便的處理這些較複雜的資料類型。
先看一看ArrayList的一個最簡單的應用,在sample2.asmx.cs中增加web方法GetArray_2:
[WebMethod(Description="數組的調用:ArrayList")]
public ArrayList GetArray_2(){
ArrayList strArr=new ArrayList();
int i=0;
for (i=0;i<100;i++){
strArr.Add("strArr["+i+"]");
}
return strArr;
}
Flash用戶端的處理與處理普通數組無異,就不列出代碼了。此圖片僅顯示局部,請點擊查看完整圖片
上面是一個複雜資料的處理執行個體,如所示。
首先來看一看伺服器端的實現:首先在sample2.asmx.cs中增加web方法GetArray_3:
[WebMethod(Description="數組的調用,包含對象")]
public Car[] GetArray_3(){
Car HG=new Car("皇冠",2004);
Car JM=new Car("佳美",2003);
Car YK=new Car("雅閣",2004);
Car BJS=new Car("畢加索",2002);
Car[] carArr={HG,JM,YK,BJS};
return carArr;
}
需要注意這裡的Car類來自哪裡呢?下面是Car類的實現:
[Serializable]
public class Car{
//聲明欄位model、yearBuilt;
public string model;
public int yearBuilt;
//定義構造器
public Car(string model,int yearBuilt){
this.model=model;
this.yearBuilt=yearBuilt;
}
public Car(){
}
}
千萬注意:Car類一定要序列化!!
在瀏覽器中測試該方法,可以返回下列XML檔案
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfCar xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.dxlschool.com/ws/">
<Car>
<model>皇冠</model>
<yearBuilt>2004</yearBuilt>
</Car>
<Car>
<model>佳美</model>
<yearBuilt>2003</yearBuilt>
</Car>
<Car>
<model>雅閣</model>
<yearBuilt>2004</yearBuilt>
</Car>
<Car>
<model>畢加索</model>
<yearBuilt>2002</yearBuilt>
</Car>
</ArrayOfCar>
再讓我們回到Flash2004,看一看用戶端的處理,非常的簡單:
function GetArray_3(result){
//定義一個數組接受ws傳值
var myDB:Array=result;
//將數組myDB與DataGrid組件gb_main綁定
gb_main.dataProvider=myDB;
}
……
this.dbBind2_bt.onPress=function(){
var op_7:PendingCall=myws.GetArray_3();
op_7.onResult=GetArray_3;
}
大功告成,赫赫,雙兒了??!!!赫赫。