ASP.NET 2.0 Callback 使得ASP.NET Server端控件可以調用服務端的方法而不須要執行一個完整的Postback過程,也就是說使得Server端控件能夠很好的支持Ajax。
xcode
Callback不一樣於Postback之處在於向服務器發送請求時只有ViewState和用戶自定義信息被髮送到服務器端,請求完畢後,只返回用戶自定義結果,而不會從Render頁面。服務器
GridView控件正是使用了這個技術來實現無刷新的分頁及排序功能,那麼它是如何實現的哪,咱們又如何在自定義控件中添加該功能哪?本文將會簡單地闡述如何使用ASP.NET 2.0 Callback來實現Ajax.異步
1. ICallbackEventHandler 接口ide
ASP.NET Server端控件能夠經過實現ICallbackEventHandler 接口來接受客戶端Callback事件。
ICallbackEventHandler 接口聲明:函數
-收縮
C#
代碼
public
interface ICallbackEventHandler
{
string GetCallbackResult();
void RaiseCallbackEvent(
string eventArgument);
}
RaiseCallbackEvent負責處理客戶端回調事件,其中方法參數eventArgument是客戶端腳本在觸發Callback時提供的,該方法將會依賴於eventArgument參數來進行處理。
GetCallbackResult則負責將處理結果做爲String返回給客戶端腳本。當Callback完成後客戶端腳本將會根據獲得的處理結果,進行頁面局部更新。this
2. CallbackEventReferencespa
那麼怎麼樣才能註冊一段客戶端腳原本觸發Callback,還須要作些什麼哪?code
ClientScriptManager類用於管理Web頁面中的客戶端腳本,提供了一系列的方法來註冊腳本,而且還能夠得到指定客戶端腳本函數的引 用。 經過ClientScriptManager類的GetCallbackEventReference方法咱們能夠獲取一個對客戶端函數的引用。當該函數 在客戶端被調用時,將啓動一次客戶端回調。
GetCallbackEventReference方法聲明:orm
-收縮
C#
代碼
public
string GetCallbackEventReference (
Control control,
string argument,
string clientCallback,
string context,
string clientErrorCallback,
bool useAsync
)
第一個參數指的是實現ICallbackEventHandler
接口的服務器端控件;
第二個參數將被傳遞給在服務器端執行的RaiseCallbackEvent方法,它能夠是一個JavaScript函數調用表達式;
第三個參數是一個JavaScript函數名,在Callback完成後,該函數將被調用,同時服務器端函數GetCallbackResult的執行結果也將做爲這一個函數的參數;
第四個參數是當前執行的Callback的上下文,這個參數也能夠是一個JavaScript函數調用表達式;
第五個參數是一個JavaScript函數名,在Callback執行的過程當中若是有錯誤產生,該函數將被調用。
第六個參數是一個Bool值來肯定當前Callback應該被同步執行仍是異步執行。server
獲取這個Callback客戶端函數的引用以後,咱們能夠註冊一個新的客戶端函數來調用它。而後再客戶端就能夠經過新註冊的函數來進行Callback了。
3.示例
咱們經過一個簡單的例子來剖析ASP.NET 2.0 Callback的整個執行過程:
-收縮
C#
代碼
public
class MyControl : WebControl, ICallbackEventHandler
{
private
const
string Script1 =
"function onCallbackComplete(result){ \n" +
" var element = document.getElementById('%ID%'); \n" +
" if(element != null) \n" +
" element.innerHTML = result;} \n";
private
const
string Script2 =
"function onCallbackError(){ \n" +
" var element = document.getElementById('%ID%'); \n" +
" if(element != null) \n" +
" element.innerHTML = 'error';} \n";
public
string GetCallbackResult()
{
return
"Callback result";
}
public
void RaiseCallbackEvent(
string eventArgument)
{
}
public
override
void RenderBeginTag(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Onclick,
"DoClientCallBack()");
base.RenderBeginTag(writer);
writer.Write(
"My Callback control");
}
protected
override
void OnPreRender(EventArgs e)
{
//Define callback references.
string callbackRef =
this.Page.ClientScript.GetCallbackEventReference(
this,
"",
"onCallbackComplete",
null,
"onCallbackError", true);
// Register script blocks will perform call to the server.
this.Page.ClientScript.RegisterClientScriptBlock(
this.GetType(),
"DoClientCallBack",
"function DoClientCallBack() { " + callbackRef +
"} \n", true
);
// Register other scripts
this.Page.ClientScript.RegisterClientScriptBlock(
this.GetType(),
"onCallbackComplete",
Script1.Replace(
"%ID%",
this.ClientID), true);
this.Page.ClientScript.RegisterClientScriptBlock(
this.GetType(),
"onCallbackError",
Script2.Replace(
"%ID%",
this.ClientID), true);
base.OnPreRender(e);
}
將上面的寫好的控件放到一個Page上,在Runtime 當點擊該控件的時候便會執行一次Callback,而且更新控件內容。
執行順序:
其中WebForm_DoCallback和WebForm_CallbackComplete是微軟JavaScript庫中的方法。
ASP.NET 2.0 Callback提供了一種簡單的方法來使得ASP.NET Server段控件能夠支持AJAX,其自己能夠看做是一種輕量級的Postback。
全文完。