您的位置:首页 > Web前端 > JavaScript

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

2008-10-23 16:33 519 查看
之前一直使用ICallBackEventHandler做一些轻量级的Ajax操作,前端点击按钮,弹出等待的信息框,接收到信息后,再取消信息框的显示,

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

<script language="Javascript" type="text/javascript">

    /* 本段函数用于实现与服务器的异步通讯 */

    function CallServer(arg){

        ShowWaitMsg(); // 一个div层,显示:任务执行中的字样

        <%=ClientScript.GetCallbackEventReference(this, "arg", "JsServerBackSucess", null, "JsServerBackError", false) %>

    }

    // 服务器运行成功时,执行的js函数

    function JsServerBackSucess(argServerBack){

        HideWaitMsg(); // 隐藏信息层

        alert(argServerBack);

    }

    // 服务器运行出错时,执行的js函数

    function JsServerBackError(argServerBack){

        HideWaitMsg(); // 隐藏信息层

        alert(argServerBack);

    }

</script>

 

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

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

function WebForm_ExecuteCallback(callbackObject) {

var response = callbackObject.xmlRequest.responseText;

if (response.charAt(0) == "s") {

    if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {

        callbackObject.eventCallback(response.substring(1), callbackObject.context);

    }

}

else if (response.charAt(0) == "e") {

    if ((typeof(callbackObject.errorCallback) != "undefined") && (callbackObject.errorCallback != null)) {

        callbackObject.errorCallback(response.substring(1), callbackObject.context);

    }

}

else {

    var separatorIndex = response.indexOf("|");

    if (separatorIndex != -1) {

        var validationFieldLength = parseInt(response.substring(0, separatorIndex));

        if (!isNaN(validationFieldLength)) {

            var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);

            if (validationField != "") {

                var validationFieldElement = theForm["__EVENTVALIDATION"];

                if (!validationFieldElement) {

                    validationFieldElement = document.createElement("INPUT");

                    validationFieldElement.type = "hidden";

                    validationFieldElement.name = "__EVENTVALIDATION";

                    theForm.appendChild(validationFieldElement);

                }

                validationFieldElement.value = validationField;

            }

            if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {

                callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);

            }

        }

    }

}

}

 

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

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

解决方法如下:

 

public partial class test : System.Web.UI.Page, ICallbackEventHandler

{

    protected void Page_Load(object sender, EventArgs e)

    {

        if(需要Response.End的条件)

        {

            // 判断是否执行了回调

            if (!string.IsNullOrEmpty(Request.Form["__CALLBACKID"]) && Request.Form["__CALLBACKID"].Equals("__Page"))

            {

                Response.Write("e我定义的错误。");  // 输出错误信息,将导致调用前台的JsServerBackError方法

                // 如果是要返回一些正常信息,以便调用前台的JsServerBackSucess方法,可以用:

                // Response.Write("s代码正常执行了。");

            }

            Response.End(); // End()后,将不会再去执行下面的RaiseCallbackEvent和GetCallbackResult方法

        }

    }

    #region ICallbackEventHandler 成员

    public string GetCallbackResult()

    {

        …………

    }

    public void RaiseCallbackEvent(string eventArgument)

    {

        …………

    }

    #endregion

}

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐