在asp.net1.1中我們可以通過JS調用Web服務來實現無重新整理應用,現在asp.net2.0可以用Client Callback的方法實現,這樣變得更加方便和容易使用了.用戶端回調功能的實現需要兩步:
1.為控制項或頁面實現ICallbackEventHandler介面,該介面有一個方法public string RaiseCallbackEvent(string eventArgument),這個方法的原理是接收用戶端發送過來的參數,然後返回一個結果字串給用戶端進行處理.例如:
public partial class ShowReview_ascx : ICallbackEventHandler
{
public string RaiseCallbackEvent(string eventArgument)
{
int reviewId = int.Parse(eventArgument);
Discussion discussion = AspNetCommerce.DiscussionManager.GetDiscussion(reviewId);
StringBuilder sb = new StringBuilder();
sb.AppendFormat("<table class='{0}>", "ShowReview_ascx_DisTable");
foreach (DiscussionItem item in discussion)
{
//輸出html
}
sb.Append("</table>");
return sb.ToString();
}
}
該方法接收用戶端的傳來的一個參數,轉換為 reviewId,根據reviewId查詢出相關資料以html形式返回給用戶端.
2.實現兩個用戶端指令碼,並使用Page.GetCallbackEventReference說明用戶端如何處理返回結果.
例如:
Page.GetCallbackEventReference(this, "topicid", "HandleResultFromServer", "context", "HandleErrorResultFromServer")
this表示實現ICallbackEventHandler的控制項的執行個體,
topicid表示用戶端傳入的字串參數數
HandleResultFromServer表示處理成功調用後的結果的用戶端指令碼函數名
context表示回調的啟動方法處與處理回調結果的方法之間的傳遞參數
HandleErrorResultFromServer表示處理失敗調用後的結果的用戶端指令碼函數名
部分用戶端指令碼如:
void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack || !this.EnableViewState)
{
StringBuilder sb = new StringBuilder();
sb.Append("function loadtree(topicid){");
sb.Append("var targetImg = document.all('img_'+topicid);");
sb.Append("var targetDiv = document.all('tr_'+topicid);");
sb.Append("if (targetDiv.style.display != 'block'){");
sb.Append("targetDiv.style.display = \"block\";");
sb.AppendFormat("targetImg.src = \"{0}\";", AspNetCommerce.CommerceContext.GetThemesImagePathForImgTag("ShowReview_ascx/Expand-Open.gif"));
sb.Append("targetImg.alt = \"點擊收回\";");
sb.Append("var context = topicid;");
sb.AppendFormat("{0}", Page.GetCallbackEventReference(this, "topicid", "HandleResultFromServer", "context", "HandleErrorResultFromServer"));
sb.Append("}else{");
sb.Append("targetDiv.style.display = \"none\";");
sb.AppendFormat("targetImg.src = \"{0}\";", AspNetCommerce.CommerceContext.GetThemesImagePathForImgTag("ShowReview_ascx/Expand-Closed.gif"));
sb.Append("targetImg.alt = \"點擊查看討論\";");
sb.Append("}");
sb.Append("}");
sb.Append("function HandleResultFromServer(result,context)");
sb.Append("{");
sb.Append("var targetTd = document.all('td_'+context);");
sb.Append("targetTd.innerHTML = result");
//sb.Append("alert(result);");
sb.Append("}");
sb.Append("function HandleErrorResultFromServer(result,context)");
sb.Append("{");
sb.Append("var targetTd = document.all('td_'+context);");
sb.AppendFormat("targetTd.innerHTML = '<font color=red>{0}</font>'",
"資料讀錯誤,請重新再試或通知管理員!");
sb.Append("}");
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ClientCallBack", sb.ToString(), true);
}
}