溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET傳輸機(jī)制是什么

發(fā)布時(shí)間:2021-12-06 15:43:09 來(lái)源:億速云 閱讀:97 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“ASP.NET傳輸機(jī)制是什么”,在日常操作中,相信很多人在ASP.NET傳輸機(jī)制是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”ASP.NET傳輸機(jī)制是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

ASP.NET頁(yè)面如果是通過(guò)post請(qǐng)求到服務(wù)器,框架將會(huì)遵行事件周期生成、調(diào)用控件,而控件(如果支持回傳)則將加載回傳數(shù)據(jù),并且映射成控件的服務(wù)器端事件,就好像在重放客戶的客戶行為(客戶按下一個(gè)按鈕,卻引發(fā)服務(wù)器端控件的click事件)。其中的機(jī)制如何?

ASP.NET組件設(shè)計(jì)之傳輸機(jī)制的問(wèn)題:如果一個(gè)控件需要處理回傳事件,那么必須實(shí)現(xiàn)一個(gè)特定接口 IPostBackEventHandler接口:

public interface IPostBackEventHandler{       void RaisePostBackEvent(string eventArgument);   }

ASP.NET組件設(shè)計(jì)之傳輸機(jī)制的另外一個(gè)接口:

IPostBackDataHandler    {   bool LoadPostData( string postDataKey,   NameValueCollection postCollection);   void RaisePostDataChangedEvent();   }

一旦控件實(shí)現(xiàn)了這些接口,頁(yè)面框架就會(huì)自動(dòng)在PostBack數(shù)據(jù)完成后,調(diào)用控件的此接口IPostBackDataHandler。LoadPostData,從而讓控件讀取post上來(lái)的數(shù)據(jù)。PostDataKey為PostBack數(shù)據(jù)中的命名鍵名,通過(guò)NameValueCollection[postDataKey]可以獲得頁(yè)面框架傳遞給控件的值??丶?yīng)當(dāng)讀取此值,進(jìn)行自己內(nèi)部狀態(tài)更新,反映狀態(tài)變化。如果控件返回真,表示服務(wù)器控件狀態(tài)改變,此時(shí)頁(yè)面框架會(huì)立即調(diào)用此控件的RaisePostDataChangedEvent方法。此時(shí),控件應(yīng)當(dāng)自己定義該引發(fā)那些服務(wù)器控件對(duì)外提供的事件。這些事件往往是控件編程者精心設(shè)計(jì)留給使用這控鍵的aspx編程者的代碼舞臺(tái)。

至于另一個(gè)接口IPostBackEventHandler,也是回傳時(shí)候服務(wù)器調(diào)用的接口。我們知道每一個(gè)控件都有一個(gè)UniqueID,當(dāng)客戶端觸發(fā)一個(gè)可以引起回傳的客戶端事件(譬如按下了submit按鈕),那么自然HTTP Post數(shù)據(jù)到服務(wù)器端,服務(wù)器頁(yè)面框架進(jìn)行到PostBack處理時(shí)候,會(huì)檢索控件是否支持IpostBackEventHandler接口,并且查找控件的UniqueID發(fā)現(xiàn)支持就立即調(diào)用此接口的RaisePostBackEvent方法,表示UniqueID的控件發(fā)生了一個(gè)需要捕獲的事件。很明顯,并非客戶端所有事件都可以投射到服務(wù)器端,只能夠是能夠引發(fā)Post Back(也就是能夠提交表單數(shù)據(jù)到服務(wù)器的事件)的事件和控件。注意,這里嚴(yán)格要求了UniqueID必須在服務(wù)器端和客戶端對(duì)應(yīng)一致,否則無(wú)法映射事件。

值得控件編寫者注意的是,如果要實(shí)現(xiàn)接口,需要如下實(shí)現(xiàn)接口,而不是通常的僅僅接口方法名同名即可:

void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)   {          ……   }

ASP.NET組件設(shè)計(jì)之傳輸機(jī)制的實(shí)現(xiàn)接口方面也就是說(shuō),接口針對(duì)頁(yè)面框架實(shí)現(xiàn)的,也由頁(yè)面框架調(diào)用。

另一方面,在客戶端,能夠引起回傳的實(shí)際上僅有2個(gè)HTML元素﹤inoput type=submit ﹥和﹤input type=image,但是通過(guò)客戶端腳本,其他客戶端事件也可導(dǎo)致回傳數(shù)據(jù)到服務(wù)器端。Page類提供了一系列的方法來(lái)幫助實(shí)現(xiàn)其他可引發(fā)回傳的途徑:

public string GetPostBackClientEvent(      Control control,      string argument   );

獲取對(duì)客戶端腳本函數(shù)的引用,該函數(shù)在被調(diào)用時(shí)將導(dǎo)致服務(wù)器回發(fā)到窗體。

public string GetPostBackClientHyperlink(      Control control,      string argument   );

將 javascript: 追加到從 GetPostBackEventReference 調(diào)用的返回的開頭,從而使服務(wù)器上可以進(jìn)行超級(jí)鏈接回發(fā)處理。

public string GetPostBackEventReference(Control);   public string GetPostBackEventReference(Control, string);

獲取對(duì)客戶端腳本函數(shù)的引用,調(diào)用該函數(shù)將使服務(wù)器

如果一個(gè)控件確定通過(guò)以上方法確??蛻舳艘l(fā)回傳事件,那么控件引用頁(yè)將導(dǎo)致最終輸出到客戶端的HTML中包含腳本,并且腳本中藏有如下隱含變量:

﹤input type=”hidden” name=”__EVENTTARGET” value=””﹥   ﹤input type=”hidden” name=”__EVENTARGUMENT” value=””﹥   ﹤script language=”javascript”﹥   ﹤!—   function __doPostBack(eventTarget,eventArgument)           {           var theform=document._ct10;           theform.__EVENTTARGET.value= eventTarget;           theform.__EVENTARGUMENT.value= eventArgument;           }   -- ﹥   ﹤/script﹥

任何客戶端腳本只要合法調(diào)用了__doPostBack方法即可實(shí)現(xiàn)回傳到服務(wù)器端,并且服務(wù)器端也知道了是引發(fā)了那一個(gè)UniqueID得控件的事件。

到此,關(guān)于“ASP.NET傳輸機(jī)制是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI