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

之前一直使用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
}
Tags:  response.write response jspresponse.end response.end

延伸阅读

最新评论

发表评论