在asp.net1.1中我們可以通過JS調用Web服務來實現(xiàn)無刷新應用,現(xiàn)在asp.net2.0可以用Client Callback的方法實現(xiàn),這樣變得更加方便和容易使用了.客戶端回調功能的實現(xiàn)需要兩步:
1.為控件或頁面實現(xiàn)ICallbackEventHandler接口,該接口有一個方法public string RaiseCallbackEvent(string eventArgument),這個方法的原理是接收客戶端發(fā)送過來的參數(shù),然后返回一個結果字符串給客戶端進行處理.例如:
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();
??? }
}
該方法接收客戶端的傳來的一個參數(shù),轉換為 reviewId,根據(jù)reviewId查詢出相關數(shù)據(jù)以html形式返回給客戶端.
2.實現(xiàn)兩個客戶端腳本,并使用Page.GetCallbackEventReference說明客戶端如何處理返回結果.
例如:
Page.GetCallbackEventReference(this, "topicid", "HandleResultFromServer", "context", "HandleErrorResultFromServer")
this表示實現(xiàn)ICallbackEventHandler的控件的實例,
topicid表示客戶端傳入的字符串參數(shù)數(shù)
HandleResultFromServer表示處理成功調用后的結果的客戶端腳本函數(shù)名
context表示回調的啟動方法處與處理回調結果的方法之間的傳遞參數(shù)
HandleErrorResultFromServer表示處理失敗調用后的結果的客戶端腳本函數(shù)名
部分客戶端腳本如:
??? 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>'",
??????????????? "數(shù)據(jù)讀錯誤,請重新再試或通知管理員!");
??????????? sb.Append("}");
??????????? Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ClientCallBack", sb.ToString(), true);
??????? }
??? }