Jquery利用ajax調用asp.net webservice的各種數據類型(總結篇)


老話說的好:好記心不如爛筆頭!

本着這原則,我把最近工作中遇到的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/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM