本文來自《ASP.NET AJAX程式設計 第II卷:用戶端Microsoft AJAX Library相關》的第三章《非同步呼叫Web Service和頁面中的類方法》,請同時參考本章的其他文章。
3.7.5 數群組類型
ASP.NET AJAX非同步通訊層能夠為數群組類型自動產生相應的用戶端JavaScript數組,如果數組中的項目為簡單類型,那麼無需任何額外操作。考慮如下的返回int[]的Web Service方法:
[WebMethod]
public int[] GetIntArray()
{
return new int[] { 1, 2, 3, 4, 5, 6 };
}
通過ASP.NET AJAX非同步通訊層調用該Web Service方法之後,傳回值在Visual Studio調試器中顯示出的結構3-27所示。
圖3-27伺服器端int[]類型在用戶端的結構
傳遞簡單類型的數組也非常直觀,考慮如下接受一個int[]參數的Web Service方法:
[WebMethod]
public void SendIntArray(int[] intArray)
{
// ......
}
我們可以在用戶端構造一個整數數組,然後通過ASP.NET AJAX非同步通訊層傳遞給該方法:
var intArray = [1, 2, 3, 4, 5];
PeopleManagementService.SendIntArray(intArray);
圖3-28顯示了傳入的整數數組在Visual Studio調試器中顯示出的結構。
圖3-28 用戶端的整數JavaScript數組可被自動轉換為伺服器端int[]類型
如果數組中包含的項目為複雜類型,那麼我們仍舊需要為Web Service類添加[GenerateScriptType(typeof([TypeName]))]屬性,其中[TypeName]表示該複雜類型的名稱。依舊是以前面的Employee類為例,考慮下面這個返回一個Employee[]類型的Web Service方法,注意其中調用了前面小節中給出的GetGenericEmployeeList()方法:
[WebMethod]
public Employee[] GetEmployeeArray()
{
return GetGenericEmployeeList().ToArray();
}
從用戶端調用該Web Service方法之後,傳回值在Visual Studio調試器中顯示出的結構3-29所示。
圖3-29伺服器端Employee[]類型在用戶端的結構
為Web Service類添加[GenerateScriptType(typeof(Employee))]屬性之後,向伺服器端傳遞Employee[]類型的數組也不難理解。考慮如下接受Employee[]類型的Web Service方法:
[WebMethod]
public void SendEmployeeArray(Employee[] employeeArray)
{
// ......
}
然後用如下JavaScript代碼構造一個包含用戶端Employee對象的數組,並傳遞給該SendEmployeeArray()方法:
var employeeArray = new Array();
for (var i = 0; i < 10; ++i) {
var em = new Employee();
em.Id = i;
em.Name = "name " + i;
em.Email = "name" + i + "@some.com";
em.Salary = 1000;
employeeArray.push(em);
}
PeopleManagementService.SendEmployeeArray(employeeArray);
ASP.NET AJAX非同步通訊層將自動把這個JavaScript數群組轉換為伺服器端的Employee[]類型。圖3-30顯示了傳入參數在Visual Studio調試器中顯示出的結構。
圖3-30用戶端的Employee數組可被自動轉換為伺服器端Employee[]類型
如果需要的話,我們還可以將數群組類型改為更為泛化的ArrayList。例如對於如下返回的ArrayList的Web Service方法來說,由於其中實際包含的仍是Employee項目,所以用戶端將仍會接收到與圖3-29中所示相同的Employee數組。
[WebMethod]
public ArrayList GetEmployeeList()
{
ArrayList employeeList = new ArrayList();
for (int i = 0; i < 10; ++i)
{
Employee em = new Employee(
i,
string.Format("name {0}", i),
string.Format("name{0}@some.com", i),
5000
);
employeeList.Add(em);
}
return employeeList;
}