现在的位置: 首页 > 综合 > 正文

使用ICallBackEventHandler接口,后台使用Response.End问题的解决

2013年07月05日 ⁄ 综合 ⁄ 共 3500字 ⁄ 字号 评论关闭

之前一直使用ICallBackEventHandler做一些轻量级的Ajax操作,前端点击按钮,弹出等待的信息框,接收到信息后,再取消信息框的显示,

但是发现后台使用了Response.End后,前台就一直没有反应,比如下面的代码,如果后台出现了Response.End,隐藏信息层的方法就会一直执行不到,导致页面一直处于等待状态了:

  1. <script language="Javascript" type="text/javascript">
  2.     /* 本段函数用于实现与服务器的异步通讯 */
  3.     function CallServer(arg){
  4.         ShowWaitMsg(); // 一个div层,显示:任务执行中的字样
  5.         <%=ClientScript.GetCallbackEventReference(this"arg""JsServerBackSucess"null"JsServerBackError"false) %>
  6.     }
  7.     // 服务器运行成功时,执行的js函数
  8.     function JsServerBackSucess(argServerBack){
  9.         HideWaitMsg(); // 隐藏信息层
  10.         alert(argServerBack);
  11.     }
  12.     // 服务器运行出错时,执行的js函数
  13.     function JsServerBackError(argServerBack){
  14.         HideWaitMsg(); // 隐藏信息层
  15.         alert(argServerBack);
  16.     }
  17. </script>

 

经过调试,发现微软对返回的信息处理的代码如下,由代码可以看出,如果调用后台出错,返回信息的第一个字母必须是e,

如果没有出错,且第一个字母不是s,那么返回信息里必须有一个|,|前面是一个数字,表示从|开始有多少个字符将作为页面的__EVENTVALIDATION的控件的值,之后剩下的字符作为返回值,扔给上面的JsServerBackSucess方法。

  1. function WebForm_ExecuteCallback(callbackObject) {
  2. var response = callbackObject.xmlRequest.responseText;
  3. if (response.charAt(0) == "s") {
  4.     if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {
  5.         callbackObject.eventCallback(response.substring(1), callbackObject.context);
  6.     }
  7. }
  8. else if (response.charAt(0) == "e") {
  9.     if ((typeof(callbackObject.errorCallback) != "undefined") && (callbackObject.errorCallback != null)) {
  10.         callbackObject.errorCallback(response.substring(1), callbackObject.context);
  11.     }
  12. }
  13. else {
  14.     var separatorIndex = response.indexOf("|");
  15.     if (separatorIndex != -1) {
  16.         var validationFieldLength = parseInt(response.substring(0, separatorIndex));
  17.         if (!isNaN(validationFieldLength)) {
  18.             var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);
  19.             if (validationField != "") {
  20.                 var validationFieldElement = theForm["__EVENTVALIDATION"];
  21.                 if (!validationFieldElement) {
  22.                     validationFieldElement = document.createElement("INPUT");
  23.                     validationFieldElement.type = "hidden";
  24.                     validationFieldElement.name = "__EVENTVALIDATION";
  25.                     theForm.appendChild(validationFieldElement);
  26.                 }
  27.                 validationFieldElement.value = validationField;
  28.             }
  29.             if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {
  30.                 callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);
  31.             }
  32.         }
  33.     }
  34. }
  35. }

 

从上面的分析看出,正因为Response.End()后,页面没有返回任何信息,所以上面这段代码就没有执行任何操作

要解决这个问题,就要按指定的格式,返回一定的信息

解决方法如下:

 

  1. public partial class test : System.Web.UI.Page, ICallbackEventHandler
  2. {
  3.     protected void Page_Load(object sender, EventArgs e)
  4.     {
  5.         if(需要Response.End的条件)
  6.         {
  7.             // 判断是否执行了回调
  8.             if (!string.IsNullOrEmpty(Request.Form["__CALLBACKID"]) && Request.Form["__CALLBACKID"].Equals("__Page"))
  9.             {
  10.                 Response.Write("e我定义的错误。");  // 输出错误信息,将导致调用前台的JsServerBackError方法
  11.                 // 如果是要返回一些正常信息,以便调用前台的JsServerBackSucess方法,可以用:
  12.                 // Response.Write("s代码正常执行了。");
  13.             }
  14.             Response.End(); // End()后,将不会再去执行下面的RaiseCallbackEvent和GetCallbackResult方法
  15.         }
  16.     }
  17.     #region ICallbackEventHandler 成员
  18.     public string GetCallbackResult()
  19.     {
  20.         …………
  21.     }
  22.     public void RaiseCallbackEvent(string eventArgument)
  23.     {
  24.         …………
  25.     }
  26.     #endregion
  27. }

 

 

抱歉!评论已关闭.