老話說的好:好記心不如爛筆頭!
本着這原則,我把最近工作中遇到的jquery利用ajax調用web服務的各種數據類型做了一個總結!
本文章沒有什么高難度技術,就是記錄一下,匯總一下,以便以后需要時查看!
本總結牽涉的數據類型,主要有:
string,int這樣的基本數據類型
ClassA這樣的自定義類
List<ClassA>這樣的集合類型
Dictionary這樣的字典類型數據
DataSet這樣的表數據類型(這種類型數據,本文提供了3種調用方式)
1.前提:項目運行環境和項目引用
本文代碼全部在vs2010下運行,所有引用如下:
jquery-1.4.1.min.js
jquery.json-2.3.min.js
Newtonsoft.Json.dll
Microsoft.Web.Preview.dll
2.代碼說明
web服務要想被ajax成功調用,請勿忘記標記上屬性:[System.Web.Script.Services.ScriptService]
各種數據類型調用代碼如下:
a.無參數,返回string
[WebMethod] public string HelloWorld ( ) { return "Hello World 我來啦!"; }
$("#ButtonNO").click(function () { var options = { type: "POST", url: "WS.asmx/HelloWorld", contentType: "application/json; charset=utf-8", dataType: "json", success: function (response) { $("#div_txt").text(response.d); } } $.ajax(options) })
說明:這是一種最基本的調用方式,由於調用數據類型設置為json,所以返回數據在response.d中
運行結果:
b.有參數,返回string
1 [WebMethod] 2 public string Get2 ( string value3 , int year ) 3 { 4 return string.Format ( "祝福您在{0}年里:{1}" , year , value3 ); 5 }
1 $("#Button2").click(function () { 2 //定義一個js類 3 //Get2方法參數名,做類的屬性名稱 4 var par = { value3: "心想事成,萬事如意", year: 2012 }; 5 6 //把對象序列化為json字符串 7 var json_str = $.toJSON(par); 8 9 var options = { 10 url: "WS.asmx/Get2", 11 type: "POST", 12 contentType: "application/json; charset=utf-8", 13 dataType: "json", 14 //由於調用類型是基於json的,所以這里傳遞的參數格式必須嚴格遵守json字符串規定 15 data: json_str, 16 success: function (response) { 17 $("#div_txt").text(response.d); 18 } 19 } 20 21 $.ajax(options) 22 })
說明:由於調用數據類型設置為json,所以傳遞給web服務的參數必須嚴格遵守json字符串格式,否則有可能會出錯
$.toJSON是引用jquery.json-2.3.min.js中的一個方法,它是把一個js類轉化為json字符串
參考:https://code.google.com/p/jquery-json/
c.返回數組
1 [WebMethod] 2 public List<double> Get_Array ( int i ) 3 { 4 List<double> list = new List<double> ( ); 5 6 for ( int j = 0 ; j < 3 ; j++ ) 7 { 8 Random ra = new Random ( ); 9 10 double d = ra.NextDouble ( ); 11 12 list.Add ( i * d ); 13 } 14 15 return list; 16 }
1 $("#Buttonarr").click(function () { 2 var par = { i: 3 }; 3 //把對象序列化為json字符串 4 var json_str = $.toJSON(par); 5 6 var options = { 7 url: "WS.asmx/Get_Array", 8 type: "POST", 9 contentType: "application/json; charset=utf-8", 10 dataType: "json", 11 data: json_str, 12 success: function (response) { 13 $.each(response.d, function (index, va) { 14 $('#div_txt').append("第" + index + "項值=" + va + " "); 15 }) 16 } 17 } 18 19 $.ajax(options) 20 })
說明:由於返回的是數組,所以利用$.each進行循環逐一取值
運行結果:
d.返回自定義類
1 [Serializable] 2 public class ClassA 3 { 4 public string Name 5 { 6 get; 7 set; 8 } 9 10 public int Age 11 { 12 get; 13 set; 14 } 15 16 public bool IsMan 17 { 18 get; 19 set; 20 } 21 22 }
1 [WebMethod] 2 public ClassA GetClass ( ) 3 { 4 return new ClassA 5 { 6 Name = "小妞妞" , 7 Age = 16 , 8 IsMan = false 9 }; 10 }
1 //返回自定義類 2 $("#Buttonclass").click(function () { 3 var options = { 4 url: "WS.asmx/GetClass", 5 contentType: "application/json; charset=utf-8", 6 dataType: "json", 7 type: "POST", 8 //GetClass方法沒有參數,所以data可以不設置 9 //data: "{}", 10 success: function (response) { 11 var obj = response.d; 12 $("#div_txt").text("姓名:" + obj.Name + " 年紀:" + obj.Age + " 是男人:" + obj.IsMan + " "); 13 } 14 } 15 16 $.ajax(options) 17 })
說明:返回的值在js中也是一個類,所以用其屬性可以訪問到值
運行結果:
e.返回自定義集合類
1 [WebMethod] 2 public List<ClassA> GetClassArray ( ) 3 { 4 List<ClassA> list = new List<ClassA> ( ); 5 6 list.Add ( new ClassA 7 { 8 Name = "小妞妞" , 9 Age = 16 , 10 IsMan = false 11 } ); 12 13 list.Add ( new ClassA 14 { 15 Name = "和和" , 16 Age = 28 , 17 IsMan = true 18 } ); 19 20 return list; 21 }
1 $("#Button_classs_list").click(function () { 2 var options = { 3 url: "WS.asmx/GetClassArray", 4 contentType: "application/json; charset=utf-8", 5 dataType: "json", 6 type: "POST", 7 success: function (response) { 8 //返回的對象數組 9 var arr = response.d; 10 //循環 index是索引 va是值 11 $.each(arr, function (index, va) { 12 //得對象 13 var obj = va; 14 var str = "姓名:" + obj.Name + " 年紀:" + obj.Age + " 是男人:" + obj.IsMan + " "; 15 $('#div_txt').append("第" + index + "項值=" + str + " "); 16 }) 17 } 18 } 19 20 $.ajax(options) 21 })
運行結果:
f.自定義類參數調用,返回自定義類
1 [WebMethod] 2 public ClassA Set_Class ( ClassA ca ) 3 { 4 return new ClassA 5 { 6 Name = ca.Name + "名字變啦" , 7 Age = 16 + 2 , 8 IsMan = false 9 }; 10 }
1 $("#Button_setclass").click(function () { 2 //自定義類參數有2種形成方式: 3 //第1種是自己用字符串拼接(例如下面的變量str) 4 //第2種是先定義js類,然后用$.toJSON方法轉化為就是字符串(例如下面的變量str2) 5 6 //ca是方法的參數名 7 var str = '{"ca":{"Name":"小高","Age":28,"IsMan":true }}'; 8 9 var obj1 = { Name: "小高", Age: 28, IsMan: true }; 10 var cl = new Object(); 11 cl.ca = obj1; 12 13 var str2 = $.toJSON(cl); 14 15 var options = { 16 url: "WS.asmx/Set_Class", 17 contentType: "application/json; charset=utf-8", 18 type: "POST", 19 dataType: "json", 20 //自定義類參數有2種形成方式 21 //data: str, 22 data: str2, 23 success: function (response) { 24 var obj = response.d; 25 $("#div_txt").text("姓名:" + obj.Name + " 年紀:" + obj.Age + " 是男人:" + obj.IsMan + " "); 26 } 27 } 28 29 $.ajax(options) 30 })
說明: 上面例題,我演示了2種參數形成方式,個人喜歡第2種方式,不喜歡那種字符串拼接的方式
g.自定義集合類參數調用,返回自定義集合類
1 [WebMethod] 2 public List<ClassA> Set_ClassArray ( List<ClassA> ClassAlist ) 3 { 4 List<ClassA> li = new List<ClassA> ( ); 5 6 foreach ( ClassA item in ClassAlist ) 7 { 8 li.Add ( new ClassA ( ) 9 { 10 Name = item.Name + "名字變啦,並且長大10歲!" , 11 Age = item.Age + 10 , 12 IsMan = !item.IsMan 13 } ); 14 } 15 16 return li; 17 }
1 $("#Button_setclassarr").click(function () { 2 //ClassAlist是方法的參數名 3 var str = '{"ClassAlist":[{"Name":"小高","Age":28,"IsMan":true },{"Name":"小皓","Age":16,"IsMan":false }]}'; 4 5 var obj1 = { Name: "小高", Age: 28, IsMan: true }; 6 var obj2 = { Name: "小皓", Age: 16, IsMan: false }; 7 8 var li = new Array(); 9 li[0] = obj1; 10 li[1] = obj2; 11 12 var cl = new Object(); 13 cl.ClassAlist = li; 14 15 var str2 = $.toJSON(cl); 16 17 var options = { 18 url: "WS.asmx/Set_ClassArray", 19 contentType: "application/json; charset=utf-8", 20 type: "POST", 21 dataType: "json", 22 //自定義類參數有2種形成方式 23 //data: str, 24 data: str2, 25 success: function (response) { 26 //返回的對象數組 27 var arr = response.d; 28 //循環 29 $.each(arr, function (index, va) { 30 //得對象 31 var obj = va; 32 var str = "姓名:" + obj.Name + " 年紀:" + obj.Age + " 是男人:" + obj.IsMan + " "; 33 $('#div_txt').append("第" + index + "項值=" + str + " "); 34 }) 35 } 36 } 37 38 $.ajax(options) 39 })
運行結果:
h.返回Dictionary
1 [WebMethod] 2 public System.Collections.Generic.Dictionary<string , ClassA> GetDictionary ( ) 3 { 4 //鍵必須為字符型,要不會報錯 5 Dictionary<string , ClassA> list = new Dictionary<string , ClassA> ( ); 6 7 list.Add ( "a" , new ClassA ( ) 8 { 9 Name = "lele" , 10 Age = 18 , 11 IsMan = false 12 } ); 13 14 list.Add ( "b" , new ClassA ( ) 15 { 16 Name = "王二" , 17 Age = 28 , 18 IsMan = true 19 } ); 20 21 return list; 22 }
1 $("#Button_Dictionary").click(function () { 2 var options = { 3 url: "WS.asmx/GetDictionary", 4 contentType: "application/json; charset=utf-8", 5 type: "POST", 6 dataType: "json", 7 success: function (response) { 8 //返回的對象數組 9 var arr = response.d; 10 //循環 11 $.each(arr, function (index, va) { 12 //得對象 13 var obj = va; 14 var str = "姓名:" + obj.Name + " 年紀:" + obj.Age + " 是男人:" + obj.IsMan + " "; 15 $('#div_txt').append("第" + index + "項值=" + str + " "); 16 }) 17 }, 18 error: function (XMLHttpRequest, textStatus, errorThrown) { 19 // 通常 textStatus 和 errorThrown 之中 20 alert(textStatus); 21 } 22 } 23 24 $.ajax(options) 25 })
說明:正常情況下,Dictionary Hashtable ListDictionary 這3個類型都不可以在WebService的方法中擔任參數和方法返回值,沒想到這次jquery竟然調用成功!小小驚喜發現!
特別提示:Dictionary的鍵值必須是字符,否則會報錯
運行結果:
i.返回DataSet
本文為DataSet演示了3種調用方式
返回DataSet第1種方式:
1 [WebMethod] 2 public DataSet GetDataSet ( string name ) 3 { 4 DataSet ds = new DataSet ( ); 5 6 DataTable dt = new DataTable ( ); 7 dt.Columns.Add ( "Year" , Type.GetType ( "System.Int32" ) ); 8 dt.Columns.Add ( "Value" , Type.GetType ( "System.String" ) ); 9 10 dt.Rows.Add ( 2011 , name + "新年快樂" ); 11 dt.Rows.Add ( 2012 , name + "萬事如意" ); 12 dt.Rows.Add ( 2013 , name + "恭喜發財" ); 13 14 ds.Tables.Add ( dt ); 15 16 return ds; 17 }
1 //返回DataSet(第1種方式,json) 2 $("#Buttonds_json").click(function () { 3 var par = { name: "東莞人民" }; 4 5 var options = { 6 contentType: "application/json; charset=utf-8", 7 dataType: "json", 8 url: "WS.asmx/GetDataSet", 9 type: "POST", 10 data: $.toJSON(par), //把對象序列化為json字符串 11 success: function (result) { 12 //取回來表中的行 13 var rows = result.d.tables[0].rows; 14 15 for (var rowIndex = 0; rowIndex < rows.length; ++rowIndex) { 16 $("#table1").append("<tr><td>" + rows[rowIndex]["Year"] + "</td><td>" + rows[rowIndex]["Value"] + "</td></tr>"); 17 } 18 }, 19 error: function (XMLHttpRequest, textStatus, errorThrown) { 20 // 通常 textStatus 和 errorThrown 之中 21 alert(textStatus); 22 } 23 } 24 25 $.ajax(options) 26 })
運行結果:
說明:這種方式項目中必須引用Microsoft.Web.Preview.dll,並且在Web.config配置文件中增加如下節點:
1 <system.web.extensions> 2 <scripting> 3 <webServices> 4 <jsonSerialization> 5 <converters> 6 <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter" /> 7 <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter" /> 8 <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter" /> 9 </converters> 10 </jsonSerialization> 11 </webServices> 12 </scripting> 13 </system.web.extensions>
返回DataSet第2種方式:
1 //返回DataSet(第2種方式,xml) 2 $("#Buttonds_xml").click(function () { 3 var par = { name: "東莞人民" }; 4 5 var options = { 6 url: "WS.asmx/GetDataSet", 7 type: "POST", 8 //返回的類型為XML 9 dataType: 'xml', 10 //由於不是json,這里傳遞的參數采用對象形式 11 data: par, 12 success: function (result) { 13 $(result).find("Table1").each(function () { 14 $("#table1").append("<tr><td>" + $(this).find("Year").text() + "</td><td>" + $(this).find("Value").text() + "</td></tr>"); 15 }) 16 }, 17 error: function (XMLHttpRequest, textStatus, errorThrown) { 18 // 通常 textStatus 和 errorThrown 之中 19 alert(textStatus); 20 } 21 } 22 23 $.ajax(options) 24 })
說明:由於采用的是xml格式調用,所以在傳遞參數時,就采用對象的形式
返回DataSet第3種方式:
[WebMethod] public string GetDataSetString ( List<ClassA> ClassA_Lists ) { DataSet ds = new DataSet ( ); DataTable dt = new DataTable ( ); dt.Columns.Add ( "Name" , Type.GetType ( "System.String" ) ); dt.Columns.Add ( "Age" , Type.GetType ( "System.Int32" ) ); dt.Columns.Add ( "IsMan" , Type.GetType ( "System.Boolean" ) ); foreach ( ClassA item in ClassA_Lists ) { dt.Rows.Add ( item.Name , item.Age , item.IsMan ); } ds.Tables.Add ( dt ); string str = JsonConvert.SerializeObject ( ds ); return str; }
1 //返回DataSet(第3種方式,string) 2 $("#ButtonDS_string").click(function () { 3 //ClassA_Lists是方法的參數名 4 var str = '{"ClassA_Lists":[{"Name":"鄧偉","Age":28,"IsMan":true },{"Name":"樂樂","Age":16,"IsMan":false }]}'; 5 6 var options = { 7 url: "WS.asmx/GetDataSetString", 8 type: "POST", 9 contentType: "application/json; charset=utf-8", 10 dataType: "json", 11 data: str, 12 success: function (response) { 13 var obj = $.evalJSON(response.d); 14 15 var arr = obj.Table1; 16 17 //循環 18 $.each(arr, function (index, va) { 19 //得對象 20 var obj = va; 21 var str = "姓名:" + obj.Name + " 年紀:" + obj.Age + " 是男人:" + obj.IsMan + " "; 22 $('#div_txt').append("第" + index + "項值=" + str + " "); 23 }) 24 }, 25 error: function (XMLHttpRequest, textStatus, errorThrown) { 26 // 通常 textStatus 和 errorThrown 之中 27 alert(textStatus); 28 } 29 } 30 31 $.ajax(options) 32 })
說明:web服務器端我利用Newtonsoft.Json.dll里面的JsonConvert.SerializeObject方法把DataSet序列化為json字符串
jquery客戶端我利用 $.evalJSON把返回的json字符串再轉化為類
關於Newtonsoft.Json.dll可以參考:http://json.codeplex.com/