国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
ASP.NET AJAX客戶端編程教程(2)——知其所以然

ASP.NET AJAX客戶端編程教程(2)——知其所以然

摘要

上一篇文章中,做了一個(gè)“Hello!ASP.NET AJAX”的小例子,但是并沒(méi)有對(duì)其中的技術(shù)做解釋。這一篇中,將探討一下使用ASP.NET AJAX框架在客戶端調(diào)用后臺(tái)代碼的基本方法,并且討論異常處理的方法。

如何在客戶端直接調(diào)用WebService中的方法?

1.Web.config中需要配置好運(yùn)行ASP.NET AJAX框架相應(yīng)的配置項(xiàng),當(dāng)然,建立一個(gè)ASP.NET AJAX Enabled Web Site項(xiàng)目時(shí),Web.config已經(jīng)配置好了。

2.想讓某個(gè)WebService可以被JS調(diào)用,需要做一下幾步:

I.在這個(gè)WebService文件里用“using System.Web.Script.Services;”引入這個(gè)命名空間。

II.在這個(gè)類的上面添加“[ScriptService]”屬性。

III.在需要被調(diào)用的方法上添加“[WebMethod]”屬性。

具體例子可以參考《ASP.NET AJAX客戶端編程之旅(一)——Hello!ASP.NET AJAX》中的SayHelloService.cs的代碼。

3.調(diào)用WebService的客戶端頁(yè)面也要做相應(yīng)準(zhǔn)備。首先就是頁(yè)面中要有一個(gè)ScriptManager控件,然后需要在其中指明WebService文件的位置。如:

<Services>
<asp:ServiceReference Path="~/SayHelloService.asmx" />
</Services>

將這段代碼放在<asp:ScriptManager>和<asp:ScriptManager />標(biāo)簽之間,就可以使得這個(gè)頁(yè)面中的JS可以直接調(diào)用SayHelloService.asmx中的方法。具體代碼可以參考《ASP.NET AJAX客戶端編程之旅(一)——Hello!ASP.NET AJAX》中第二個(gè)例子中的Default.aspx的代碼。

做好以上三項(xiàng)準(zhǔn)備,這個(gè)頁(yè)面中的JS代碼就可以使用我們熟悉的“類名.方法名”的方法直接調(diào)用WebService中的方法了。

魔法背后的故事

我們知道,雖然我們一直說(shuō)是“直接調(diào)用”,但這是指在語(yǔ)法層面上“直接調(diào)用”。而實(shí)際上,JavaScript代碼是不可能真正直接調(diào)用后臺(tái)程序的,這中間一定使用了XMLHttpRequest對(duì)象。那么,到底是誰(shuí)給我們實(shí)施了“障眼法”?答案就在下面這張圖上:

上圖就是這個(gè)所謂“直接調(diào)用”真正的秘密。如圖,現(xiàn)在假設(shè)有個(gè)WebService類,名為Class1,有兩個(gè)方法:Method1和Method2。當(dāng)這個(gè)WebService被我們用上面提到的方法處理過(guò)后,ASP.NET AJAX框架就會(huì)自動(dòng)分析這個(gè)類,并且在客戶端生成一個(gè)這個(gè)類的客戶端代理(Proxy),這個(gè)代理類是一個(gè)JavaScript對(duì)象,其類名、方法名都和后臺(tái)類一致。而當(dāng)我們從客戶端的JS腳本調(diào)用時(shí),實(shí)際上調(diào)用的是這個(gè)代理類,而代理類則使用XMLHttpRequest對(duì)象,通過(guò)傳統(tǒng)的Ajax方式,調(diào)用后臺(tái)類。這樣,我們就感覺(jué)好像在前臺(tái)直接調(diào)用后臺(tái)類似的。

可是……哪里似乎還是不一樣……

通過(guò)上面的分析,我們知道,ASP.NET AJAX調(diào)用后臺(tái)方法,說(shuō)到底還是使用的XMLHttpRequest對(duì)象,這樣傳統(tǒng)Ajax的限制,就使得我們不可能真的像在后臺(tái)調(diào)用方法一樣方便。

例如,我們?cè)诤笈_(tái)都是用“變量=類名.方法名”或者“變量=對(duì)象名.方法名”的方式調(diào)用,這樣變量就直接獲取了這個(gè)方法的返回值,但是Ajax不行,它必須通過(guò)回調(diào)函數(shù)獲取返回值,這一點(diǎn)也體現(xiàn)在了ASP.NET AJAX的使用方法上??瓷弦黄恼碌睦泳椭溃词故褂昧薃SP.NET AJAX框架,仍然還是需要用回調(diào)函數(shù)的,只不過(guò)是語(yǔ)法上簡(jiǎn)化了。

下面,正式給出調(diào)用后臺(tái)類的語(yǔ)法:

類名.方法名(參數(shù)1,參數(shù)2,……,參數(shù)n,回調(diào)函數(shù))

也就是說(shuō),調(diào)用上有兩個(gè)差別:一是不需要使用變量接收返回值,二是要在所有參數(shù)后面加一個(gè)參數(shù):回調(diào)函數(shù)。例如,有個(gè)類的方法,在后臺(tái)調(diào)用是:

var1 = Class1.Method1(Para1,Para2);

換到前臺(tái)JS調(diào)用時(shí),就是如下的樣子:

Class1.Method1(Para1,Para2,CallBackFunction);

那么,返回值到哪里去取呢?答案是到回調(diào)函數(shù)中,回調(diào)函數(shù)的原型是:回調(diào)函數(shù)名(返回值)。當(dāng)然,存儲(chǔ)返回值變量的名字是開(kāi)發(fā)人員隨意取的,然后就可以在回調(diào)函數(shù)中使用這個(gè)返回值變量了。例如,接著上面程序,寫(xiě)一個(gè)函數(shù):

function CallBackFunction(result){}

則在這個(gè)函數(shù)中,result就含有Class1.Method1(Para1,Para2,CallBackFunction);的返回值。

為什么不直接調(diào)用類中的方法,而非要經(jīng)過(guò)WebService呢?

上文我曾經(jīng)說(shuō)過(guò),ASP.NET AJAX允許我們直接調(diào)用后臺(tái)類中的方法,但是我們不提倡這樣做,而是提倡經(jīng)過(guò)WebService的過(guò)渡。其原因有如下幾點(diǎn):

1.要使得某個(gè)類可以被JS調(diào)用,也需要在其中做一些修改,如增加一些屬性(Attribute)等,這會(huì)對(duì)這些類造成一種“污染”。

2.我們知道了,使用ASP.NET AJAX框架也需要從回調(diào)函數(shù)中獲取返回值,而不是直接獲取??紤]以下情況:如果某段JS需要調(diào)用三個(gè)后臺(tái)方法完成一個(gè)操作,那么,就需要寫(xiě)三個(gè)回調(diào)函數(shù)。即要經(jīng)過(guò)“調(diào)用第一個(gè)方法-第一個(gè)回調(diào)函數(shù)中調(diào)用第二個(gè)方法-第二個(gè)回調(diào)函數(shù)中調(diào)用第三個(gè)方法-第三個(gè)回調(diào)函數(shù)中取得返回值”。

這個(gè)過(guò)程很麻煩。而使用WebService后,我們可以將這個(gè)三個(gè)方法封裝到一個(gè)WebService方法里,因?yàn)閃ebService是支持“變量=類名.方法名”這種傳統(tǒng)的調(diào)用方法的。這樣經(jīng)過(guò)WebService過(guò)渡,JS中只要一個(gè)回調(diào)函數(shù)就可以了。

3.從本身特性上看,WebService比普通類更適合作為Ajax的后臺(tái)方法。

處理異常

一般來(lái)說(shuō),有成功就有失敗,異步調(diào)用也是一樣,會(huì)出現(xiàn)請(qǐng)求異常的情況。在傳統(tǒng)的Ajax中,不論請(qǐng)求成功還是失敗,回調(diào)函數(shù)都會(huì)被調(diào)用,然后我們可以判斷 XMLHttpRequest對(duì)象的狀態(tài)確定請(qǐng)求是否成功,如果失敗了,可以進(jìn)行異常處理。

但是,在ASP.NET AJAX應(yīng)用中,只有成功時(shí)回調(diào)函數(shù)才會(huì)被調(diào)用,那么失敗時(shí)怎么辦?其實(shí),ASP.NET AJAX允許我們?cè)谡{(diào)用后臺(tái)方法時(shí)指定兩個(gè)回調(diào)函數(shù),語(yǔ)法如下:

類名.方法名(參數(shù)1,參數(shù)2,……,參數(shù)n,請(qǐng)求成功時(shí)的回調(diào)函數(shù),請(qǐng)求失敗時(shí)的回調(diào)函數(shù))

只不過(guò)在前面的應(yīng)用中,我們省略了第二個(gè)回調(diào)函數(shù)。為了理解這個(gè)地方,我們做一個(gè)小實(shí)驗(yàn),打開(kāi)上一篇中的ASPNETAJAXTest這個(gè)程序,將ajax.js這個(gè)文件里的內(nèi)容做如下修改:

ajax.js:

1//單擊btnSayHello時(shí)調(diào)用的JS函數(shù)
2function btnSayHello_onClick()
3{
4 SayHelloService.SayHello(OnSucceeded,OnFailded);
5}
6
7//成功時(shí)的回調(diào)函數(shù)
8function OnSucceeded(reusltText)
9{
10 get("result").innerHTML=reusltText;
11}
12
13//失敗時(shí)的回掉函數(shù)
14function OnFailded(error)
15{
16 get("result").innerHTML="調(diào)用失敗。錯(cuò)誤信息:"+error.get_message();
17}

其中異常時(shí)的回調(diào)函數(shù)有一個(gè)參數(shù)error,它是一個(gè)ASP.NET AJAX框架定義的一個(gè)對(duì)象,包含了異常信息。其中g(shù)et_message()方法將返回異常信息字符串。

為了看效果,我們還要到WebService里搞一點(diǎn)破壞,讓請(qǐng)求出現(xiàn)異常,“破壞”后的WebService如下:

SayHelloService.cs:

using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class SayHelloService : System.Web.Services.WebService
{
public SayHelloService() { }

[WebMethod]
public string SayHello()
{
//Hello myHello = new Hello();
//return myHello.SayHello();
throw new Exception("我來(lái)搞破壞!");
}
}

這里我們手工拋出了一個(gè)異常。下面運(yùn)行程序,會(huì)得到如下結(jié)果:

如上圖,當(dāng)出現(xiàn)異常時(shí),不僅自動(dòng)調(diào)用了異常處理回調(diào)函數(shù),還很方便地取得了錯(cuò)誤信息。

結(jié)束語(yǔ)

本篇介紹了從JavaScript中調(diào)用WebService的一般方法、基本原理及使用異常處理,并且回答了上一篇留下的幾個(gè)問(wèn)題。然而還有一個(gè)問(wèn)題沒(méi)有討論:到目前為止,我們調(diào)用的后臺(tái)方法都是沒(méi)有參數(shù)的,那么如果有參數(shù),ASP.NET AJAX可以實(shí)現(xiàn)JavaScript變量類型和C#變量類型的自動(dòng)轉(zhuǎn)換嗎?如果是復(fù)雜類型呢?如實(shí)體類、各種對(duì)象。再進(jìn)一步,如果可以,應(yīng)該怎么來(lái)做呢?我們將在下一篇討論這個(gè)問(wèn)題。

主要參考文獻(xiàn)

[1] 陳黎夫,ASP.NET AJAX程序設(shè)計(jì)-第II卷:客戶端,人民郵電出版社,2007年10月

來(lái)源:http://www.cnblogs.com/leoo2sk

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
asp.net中javascript與后臺(tái)c#交互
JavaScript模擬命名空間
淺談ASP.NET中如何使用AJAX中的方式-.Net編程教程-模板無(wú)憂_www.Mb5u...
ASP.NET MVC學(xué)習(xí)系列(二)
C#面試題和答案
Asp.net 學(xué)習(xí)記錄(一)使用asp.net 構(gòu)建webAPI接口
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服