[VS2010/.NET 4.0贈書活動自我修練] AJAX設計方法之一 ICallbackEventHandler

  • 4320
  • 0
  • 2010-12-07

[VS2010/.NET 4.0贈書活動自我修練] AJAX設計方法之一 ICallbackEventHandler

上一篇提到實現AJAX的幾個方式及簡單的use UpdatePanel,本篇即針對方法之一的ICallbackEventHandler做介紹

ICallbackEventHandler是.NET Framework 2.0 版所提供,用來實作Client 端Callback的一個介面

因此若要採用此種方式則必須實作此介面及所屬的二方法.GetCallbackResult()與.RaiseCallbackEvent(string eventArgument)

相較於use UpdatePanel,此種方式必須撰寫少許的JavaScript Code

 

以下就拿上一篇所提及的範例,以ICallbackEventHandler方式來實作

 

(1)在Page本身必須實作ICallbackEventHandler介面(命名空間: System.Web.UI)

image

 

(2) RaiseCallbackEvent 方法的實作(進行你所要作業的Server端動作)

以本範例來說,在RaiseCallbackEvent 裡,進行Data Query的動作,以準備好要回傳的資料

此方法所接收的傳入參數值是字串型態

(3) GetCallbackResult 方法的實作(用以將Callback結果回傳Client端)

#region ICallbackEventHandler Members
private  string resultstr = "";
public string GetCallbackResult()
{
    return resultstr;
}

public void RaiseCallbackEvent(string eventArgument)
{
    if (!string.IsNullOrEmpty(eventArgument))
    {

        SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["Demo2010ConnectionString"].ToString());

        using (SqlCommand command = new SqlCommand())
        {
            conn.Open();
            command.Connection = conn;
            command.CommandText = "select ........ logonid=@logonid ";
            command.Parameters.Add("@logonid", System.Data.SqlDbType.VarChar, 20).Value = eventArgument;
            object result = command.ExecuteScalar();
            if (result != null)
                resultstr = (string)result.ToString();
            command.Connection.Close();
        }
    }
}

#endregion

 

(4) 到這裡會發現到, 目前所撰寫的code都是Server端的,那前端如何做AJAX的呼叫呢?
 
接著就要利用Page.ClientScript.GetCallbackEventReference來協助了 
 
本文一開始就提到了,使用此方式進行AJAX必須撰寫少量的JavaScript,所以接下來就是這個部份了
 
 
以本範例來說,需要在TextBox輸入完畢後,立即進行AJAX動作到資料庫取得資料,並顯示於畫面上
 
因此我們利用onblur來進行,以下總共準備三個JAVA Script function
 

function AjaxGetUser(logonid) : TextBox註冊onblur滑鼠事件, 當輸入完帳號游標離開輸入框時, call AjaxGetUser並傳入所輸入的帳號

 

function CallServer(args,context) : 用以call後端server method

 

function ClientCallBack(args,context):接受回傳值並處理前端所要展現的相關動作

 

 

protected void Page_Load(object sender, EventArgs e)

{

    string jscript = "<script language=javascript>  \n" +

                    "function AjaxGetUser(logonid)  \n" +

                    "{ \n" +

                    "   CallServer(logonid,''); \n" +

                    "} \n" +

                    "function CallServer(args,context) \n" +

                    "{ \n" +

                    " " + Page.ClientScript.GetCallbackEventReference(this, "args", "ClientCallBack", "") + " \n " +

                    "} \n" +

                    "function ClientCallBack(args,context) \n" +

                    "{ \n" +

                    "    document.getElementById('" + this.TextBox1.ClientID + "').innerHTML = args; \n" +

                    "} \n" +

                    "</script>";

    ClientScript.RegisterClientScriptBlock(this.GetType(), "js", jscript);

 

    this.TextBox1.Attributes.Add("onblur", "AjaxGetUser(this.value)");

 

}在上述程式碼裡,可以看到function CallServer(args,context)裡,利用Page.ClientScript.GetCallbackEventReference來協助進行AJAX

,因此如何做AJAX的CALL Back動作完全不用開發人員來撰寫code,以下為檢視原始碼的結果,可以看到Page.ClientScript.GetCallbackEventReference

展現至前端時會是WebForm_DoCallback('__Page',args,ClientCallBack,"",null,false)

 

描述: image

 

因此我們可以知道,採用ICallbackEventHandler所實現的AJAX,基本上還是有借助.NET本身一些Libary來達成AJAX

不過與前篇使用UpdatePanel比較起來,雖然需要寫少許的JavaScript(不多也不難),但傳輸量可是大大減少很多,這

有助於提升效能

以HttpWatch Tool可以看到在Received Size只有436,小於上一篇UpdatePanel的1093

描述: image

 

延伸參考資料

ICallbackEventHandler 介面

在ASP.NET Web 網頁中實作用戶端回呼但不回傳

ClientScriptManager.GetCallbackEventReference 方法(String, String, String, String, String, Boolean)

用戶端回呼實作(C#) 範例

HOW TO:在ASP.NET Web 網頁中實作回呼

實作驗證的用戶端回呼範例

 

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18