昨天網上一位朋友推薦我看了一篇文章《Remote Scripting in .NET》,這篇文章的作者利用了Microsoft Remote Scripting技術,在伺服器端進行了一些封裝,方便了在ASP.NET中的頁面上調用直接調用伺服器端方法。
說起來我以前對Microsoft Remote Scripting還是挺陌生的,MRS的原理是利用了內建的一個Java Applet,通過一些高層的封裝,使頁面上使用Script能夠直接調用伺服器上公開的方法。感興趣的朋友可以看看MSDN上的文檔,用起來還算是方便,特別是配合前面那篇文章作者做的那個封裝的.NET組件。
不過我個人對Applet並不是很感冒,特別是在我家裡的那台沒有安裝JRE的WinXP SP2RC2的機器上更是根本沒法用...
其實我最喜歡的還是ASP.NET 2.0中的Script Callback那樣的實現方式,簡單、明了,於是想到,既然它也是底下使用XMLHTTP來實現的,那不如我自己在ASP.NET 1.1下面也照樣用XMLHTTP實現一個好了。花費了一陣功夫,大功告成。大部分都是仿造的ASP.NET 2.0中的實現方式,但是部分地方還是不能做到完全一樣,因為對於實現ICallbackEventHandler介面的控制項的處理,我沒法直接寫到Page類或更裡面的地方,所以需要在頁面裡面建立一個ScriptCallbackManager的控制項。
伺服器端的進行步驟:
1、讓頁面上的某個控制項實現ICallbackEventHandler介面,我個人喜歡就讓Page類直接實現;
2、在實現了ICallbackEventHandler介面的控制項上實現RaiseCallbackEvent方法,來處理用戶端的請求;
3、在頁面中加入一個ScriptCallbackManager控制項,在建構函式中指明實現了ICallbackEventHandler介面的控制項,和調用完成後執行用戶端的Script函數名。
public class WebForm1 : System.Web.UI.Page, ICallbackEventHandler
{
private void Page_Load(object sender, System.EventArgs e)
{
this.Controls.Add(new ScriptCallbackManager(this, "handleResultFromServer"));
}
public String RaiseCallbackEvent(String eventArgument)
{
return "You sent " + eventArgument + " !";
}
頁面上的進行步驟:
1、在需要調用伺服器方法的地方直接調用內建的scriptCallback()函數,第一個參數指定了要傳遞到伺服器端的變數,第二個參數指定了此次請求的上下文;
2、編寫一個在完成調用之後自動執行的函數,這個函數的名稱需要和伺服器端ScriptCallbackManager控制項的建構函式中指定的函數名稱相同。
function callBack()
{
var param = document.all.txtRequest.value;
var context = "";
scriptCallback(param, context);
}
function handleResultFromServer(result, context)
{
alert(result);
}
在callBack()方法中調用了系統內建的一個Script函數scriptCallBack(),這個函數會自動調用伺服器方法,並將第一個參數的值傳給伺服器端的RaiseCallbackEvent()方法的參數。handleResultFromServer是在調用完成後自動執行的函數。
感興趣的朋友可以在這裡下載到這個Script Callback實現的項目源碼。