使用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
}
但是发现后台使用了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
}
相关文章推荐
- 使用ICallbackEventHandler接口实现的轻量级下拉框联动
- 关于使用ICallbackEventHandler接口 ,传递中文时的错误
- 使用ICallbackEventHandler接口实现页面无刷新
- SSM框架:解决后台传数据到前台中文乱码问题,使用@ResponseBody返回json 中文乱码
- 使用ICallbackEventHandler接口实现的轻量级下拉框联动
- ASP.Net页面实现ICallbackEventHandler接口,不能工作的问题。
- 解决springMVC4下使用@ResponseBody的中文乱码问题
- 使用Response.Redirect跳转时显示提示内容的问题该怎么解决
- 详解解决使用axios发送json后台接收不到的问题
- 解决AJAX中使用UpdatePanel后再用Response.Write();等无法弹出对话框问题
- SpringMVC使用@ResponseBody输出字符串时遇到的乱码问题及解决办法
- 在自定义控件中实现ICallbackEventHandler接口不经过回发而实现客户端回掉
- SpringMVC使用@ResponseBody输出字符串时遇到的乱码问题及解决办法
- 解决AJAX中使用UpdatePanel后再用Response.Write();等无法弹出对话框问题
- fckeditor出现the server didn't send back a proper XML response问题的解决(因为使用了“主题”)
- Spring3 MVC使用@ResponseBody的乱码问题及解决办法
- 细讲android获取流量使用情况,以及解决调用流量接口不准问题(非TrafficStats,而是NetworkStatsHistory)
- 解决变参数问题:va_list、va_start、vsnprintf、va_end的使用方法和实例
- Springboot使用FastJson后,接口返回中文乱码的问题解决(两种解决方式)