從一開始,開發人員便受制于web的無固定狀態這一特性。也就是,一旦某個頁面被請求并加載,客戶端到服務器端的連接便一直持續。ajax動作將焦點集中于xmlhttp對象,這個對象使得服務器間的通訊成為可能。最新版的asp.net(2.0)提供了自己的方式來獲取服務器請求,不再要求用戶參與。
無法連接
幾年來,人們提出各種各樣的方法來規避web應用中的無固定狀態局限。主要的方法是減少頁面請求或重載的數量,以避免影響用戶感覺。例如,很多開發人員使用隱藏框架作為數據源,這樣數據就可以很簡單的發送或接收,另外,一些開發人員也選擇一開始加載所有需要加載項,從而后續頁面加載量就減少了。但是,在必須請求服務器端調用時就會出現問題,從而引進了ajax組技術。ajax利用xmlhttp對象以及xml和客戶端腳本(如javascript)來處理異步服務器調用。
asp.net模型
當頁面被用戶請求時,asp.net頁面的默認行為開始發生并在請求的客戶端加載。用戶通過諸如單擊按鈕等各種動作來和頁面進行交互。這些動作可能觸發一個稱為postback的服務器端調用(例如,作為動作的結果返回給請求主機的頁面是重新加載的該頁面的更新版)
頁面返回是要付出代價的。例如,可能會丟失客戶端狀態,以及在和服務器通訊時可能會影響用戶體驗因為他們要等待通訊和頁面重載。ajax方法通過使用一臺服務器輔助異步通訊來解決這些問題,且不會影響用戶體驗。一個類似的方法可以通過使用asp.net 2.0的icallbackeventhandler接口實現。
實現callback
callback是一個結合了某個特定的用戶接口對象的函數。它執行某個動作作為對對象事件的反應。事件可以是大量鼠標單擊或者其他事件中的任何一個。
在asp.net 2.0中實現callbacks和標準web頁中實現有些差異。下面列出了需要在頁面代碼中修改的地方:
1 、頁面必須實現icallbackeventhandler接口。
2 、頁面必須實現icallbackeventhandler接口的raisecallbackevent方法,在服務器上調用這個方法執行callback函數。
3 、頁面必須實現icallbackeventhandler接口的getcallbackresult方法,這個方法將把callback函數的執行結果返回給客戶端。
經過了以上代碼修改,就可以在客戶端頁面(html源代碼)使用callback函數。頁面必須包括客戶端函數以用來執行實際的服務器請求以及接收服務器請求的返回結果。
<%@ page language="c#" %>
<%@ implements interface="system.web.ui.icallbackeventhandler" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" >
<html><head>
<title>asp.net callback</title>
<script language="c#" runat="server">
void page_load(object sender, eventargs e) {
string callbackref;
string callbackscript;
callbackref= page.clientscript.getcallbackeventreference(this,"arg","getdata","");
callbackscript = "function callserver(arg, context) {" + callbackref + "; }";
page.clientscript.registerclientscriptblock(this.gettype(), "callserver", callbackscript, true);
}
public string getcallbackresult() {
return "the current time is: " + datenow.tostring();
}
public void raisecallbackevent(string eventargument) {
}
</script>
<script type="text/javascript">
function getdata(arg, context) {
results.innertext = '';
}
</script></head><body>
<form id="frmcallback" name="frmcallback" runat="server">
<input type="button" value="callback" />
<br><span id="results"></span>
</form></body></html>
中的c#頁提供了實現callback的一個實例。下面是部分代碼說明:
1、該頁面中的page_load事件通過頁面的clientscript屬性中的getcallbackeventreference方法設定一個對callback函數的引用。這個方法可以接受這些參數:對頁面的引用;傳遞數據的參數名;接收callback數據的客戶端函數名;傳遞你想要得到的任何環境變量的參數名,在本例中,這個環境變量未使用。
2、包含的引用函數用來創建用于調用服務器的函數(在本例中為callbackscript變量)。當然,被生成函數接受的參數名必須和傳遞給getcallbackeventreference方法的名字相匹配。最后,callback腳本必須通過頁面對象clientscript屬性中的registerclientscriptblock方法進行注冊。
3、getcallbackresult方法提供callback函數返回的輸入結果。本例中服務器上的當前數據和時間被返回。
4、 接收callbacks的客戶端函數在頁面的頭部被加載(本例中為getdata)。這個函數名必須和傳遞給getcallbackeventreference方法的相匹配。該函數接收兩個字符串值作為返回值和一個可選第二值作為由服務器返回的環境變量值。
5 、頁面中的按鈕和callback函數相關聯。在本例中,html的span對象接收callback返回結果。
順暢的用戶體驗
避免頁面重載簡化用戶體驗減少客戶端和服務器端的數據傳輸量。你可以使用ajax方法提供這個功能。你還可以使用asp.net 2.0的callback函數提供支持。這些技術的應用是多方面的,總之,任何提高用戶體驗的改進都是對業務有益的。
新聞熱點
疑難解答
圖片精選