jQuery.ajax( options ) 有很多選項(xiàng),介紹其中的幾個(gè): ·dataType:想從服務(wù)器得到哪種類型的數(shù)據(jù)。xml,html,script,json,jsonp,text ·success:請(qǐng)求成功后的處理函數(shù) ·type:以POST或GET的方式請(qǐng)求。默認(rèn)GET。PUT和DELETE也可以用,但并不是所有的瀏覽器都支持 ·url:請(qǐng)求的目的地址,須是一個(gè)字符串。 ·complete:不管請(qǐng)求成功還是錯(cuò)誤,只要請(qǐng)求完成,可以執(zhí)行的事件。 ·beforeSend:傳遞異步請(qǐng)求之前的事件。 這次說解,使用firedebug來配合說解。 (一)請(qǐng)求ashx文件,并添加ajax事件,添加緩沖提示 描述:請(qǐng)求數(shù)據(jù),請(qǐng)求超時(shí)時(shí)間設(shè)置為5秒,如果超時(shí),那么輸出超時(shí)提示,且在這5秒中的等待過程中,提供等圖標(biāo),5秒之后,提示請(qǐng)求超時(shí)。 (1)ashx文件 Customer customer = new Customer { Unid = 1, CustomerName = "宋江", Memo = "天魁星", Other = "黑三郎" }; string strJson = Newtonsoft.Json.JsonConvert.SerializeObject(customer); System.Threading.Thread.Sleep(1000*7); context.Response.Write(strJson); 為了讓客戶端請(qǐng)求超時(shí),服務(wù)設(shè)置延時(shí)7秒。 (2)ajax post請(qǐng)求 function ajax_ashx() { $.ajax({ url: "webdata/ajax_1.ashx", type: "post", success: function(data) { var jsonObject = $.jsonToObject(data); var tt = ''; $.each(jsonObject, function(k, v) { tt += k + ":" + v + "<br/>"; }); $("#divmessage").html(tt); }, cache: false, timeout: 5000, error: function() { alert("超時(shí)"); } });} 設(shè)置超時(shí)時(shí)間5000ms,超時(shí)錯(cuò)誤出示超時(shí)錯(cuò)誤。 (3)設(shè)置客戶端請(qǐng)求等待圖標(biāo) ·<img src="images/loader.gif" id="ajaximg" /> 找個(gè)小圖標(biāo) ·為這個(gè)圖標(biāo)設(shè)置ajax事件 $("#ajaximg").bind("ajaxSend", function() { Show(); }); $("#ajaximg").bind("ajaxComplete", function() { Hide(); }); function Hide() { $("#ajaximg").hide(); } function Show() { $("#ajaximg").show(); } 在客戶端5秒請(qǐng)求的時(shí)間限制下,請(qǐng)求超時(shí),提示超時(shí)錯(cuò)誤。 ·在ashx端contentType的設(shè)置對(duì)返回的數(shù)據(jù)沒有影響 ·客戶端dataType也沒有影響,可以省略。 ·在firebug里可以看到返回的數(shù)據(jù)為:
所以可以按以前我說過的方法進(jìn)行解析。 (二)正常請(qǐng)求,并解析 ·ashx Customer customer = new Customer { Unid = 1, CustomerName = "宋江", Memo = "天魁星", Other = "黑三郎" }; Customer customer2 = new Customer { Unid = 2, CustomerName = "吳用", Memo = "天機(jī)星", Other = "智多星" }; List<Customer> _list = new List<Customer>(); _list.Add(customer); _list.Add(customer2); string strJson = Newtonsoft.Json.JsonConvert.SerializeObject(customer); System.Threading.Thread.Sleep(1000 * 3); context.Response.Write(strJson); · function ajax_ashxList() { $.ajax({ url: "webdata/ajax_1.ashx", type: "post", dataType: "json", success: function(data) { var tt = ''; $.each(data, function(k, v) { $.each(v, function(kk, vv) { tt += kk + ":" + vv + "<br/>"; }); }); $("#divmessage").html(tt); }, cache: false, timeout: 5000, error: function() { alert("超時(shí)"); } }); } ·dataType要是json ·在firebug里
雖然是字串,但這里直接用就行,不用轉(zhuǎn)換為json對(duì)象。這一點(diǎn)我現(xiàn)在還不明白怎么回事。 (三)請(qǐng)求ws 這次請(qǐng)求返回字串類型的web方法。 (1)Hello [WebMethod] public string HelloWorld() { return "Hello World"; } function ajax_webserviceHello() { $.ajax({ type: "post", contentType: "application/json", url: "ajax_1.asmx/HelloWorld", data: "{}", dataType: 'json', success: function(data) { alert(data.d); } }); } ·contentType,data都不能為空,即使data為空,也要帶空參數(shù)
發(fā)現(xiàn)服務(wù)端請(qǐng)求到的數(shù)據(jù)是這樣的。所以,訪問時(shí),要以data.d來訪問。(在.net3.5中)。但也可以如下訪問: $.each(data, function(k, v) { alert(v); }); (2)Customer 這次得到一個(gè)客戶實(shí)體 [WebMethod] public string GetCustomer() { Customer customer = new Customer { Unid = 1, CustomerName = "宋江", Memo = "天魁星", Other = "黑三郎" }; string strJson = Newtonsoft.Json.JsonConvert.SerializeObject(customer); return strJson; } function ajax_webserviceCustomer() { $.ajax({ type: "post", contentType: "application/json", url: "ajax_1.asmx/GetCustomer", data: "{}", dataType: 'json', success: function(data) { var tt = ''; var jsonObject = $.jsonToObject(data.d); $.each(jsonObject, function(k, v) { tt += k + ":" + v + "<br/>"; }); $("#divmessage").html(tt); } }); } 發(fā)現(xiàn)返回的也是以d為key的一個(gè)object。
這點(diǎn)應(yīng)該注意。 (3)customer list [WebMethod] public string GetCustomerList() { Customer customer = new Customer { Unid = 1, CustomerName = "宋江", Memo = "天魁星", Other = "黑三郎" }; Customer customer2 = new Customer { Unid = 2, CustomerName = "吳用", Memo = "天機(jī)星", Other = "智多星" }; List<Customer> _list = new List<Customer>(); _list.Add(customer); _list.Add(customer2); string strJson = Newtonsoft.Json.JsonConvert.SerializeObject(_list); return strJson; } function ajax_webserviceCustomerList() { $.ajax({ type: "post", contentType: "application/json", url: "ajax_1.asmx/GetCustomerList", data: "{}", dataType: 'json', success: function(data) { var tt = ''; var jsonObject = $.jsonToObject(data.d); $.each(jsonObject, function(k, v) { $.each(v, function(kk, vv) { tt += kk + ":" + vv + "<br/>"; }); }); $("#divmessage").html(tt); } }); }
這也是一個(gè)以d為key的對(duì)象。 (4)with para [WebMethod] public string GetCustomerListWithPara(int iUnid) { Customer customer = new Customer { Unid = 1, CustomerName = "宋江", Memo = "天魁星", Other = "黑三郎" }; Customer customer2 = new Customer { Unid = 2, CustomerName = "吳用", Memo = "天機(jī)星", Other = "智多星" }; List<Customer> _list = new List<Customer>(); _list.Add(customer); _list.Add(customer2); var cus = from q in _list where q.Unid == iUnid select q; string strJson = Newtonsoft.Json.JsonConvert.SerializeObject(cus); return strJson; } function ajax_webserviceCustomerListWithPara() { $.ajax({ type: "post", contentType: "application/json", url: "ajax_1.asmx/GetCustomerListWithPara", data: "{iUnid:"+1+"}", dataType: 'json', success: function(data) { var tt = ''; var jsonObject = $.jsonToObject(data.d); $.each(jsonObject, function(k, v) { $.each(v, function(kk, vv) { tt += kk + ":" + vv + "<br/>"; }); }); $("#divmessage").html(tt); } }); }
這也是一個(gè)以d為key的對(duì)象。 綜上所述,在對(duì)web服務(wù)進(jìn)行請(qǐng)求時(shí): ·在.net3.5中,訪問web服務(wù)時(shí),返回的元素是一個(gè)以d為key的k/v對(duì)。如果要進(jìn)行下一步解析,要認(rèn)識(shí)d屬性。(這是在當(dāng)web方法返回json字串時(shí)成立) ·在.net3.5中,訪問web服務(wù),要對(duì)web服務(wù)添加修飾:[System.Web.Script.Services.ScriptService] 否則,當(dāng).ajax()請(qǐng)求服務(wù)時(shí),會(huì)有異常: 只能從腳本中調(diào)用在類定義上有[ScriptService]屬性的 Web 服務(wù) |
|