要实现客户端回调的ASP.NET页的CS代码与创建ASP.NET页的过程类似,但也存在一些区别。该页的服务器代码必须:1、实现ICallbackEventHandler接口;2、提供RaiseCallbackEvent方法的实现;3、提供GetCallbackResult方法的实现。同时在客户端必须三个脚本函数:1、一个函数调用帮助器方法,该方法执行对服务器的实际请求;2、客户端回调函数,处理回调事件的服务器代码的结果调用并接收该结果;3、第三个函数是执行实际服务器请求的 Helper 函数。当在服务器代码中使用 GetCallbackEventReference方法生成对此函数的引用时,ASP.NET 将自动生成此函数。
现在,我们从实例来分析Callback的实现方法。
.aspx页源代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>CallbackDemo</title>
<script type="text/javascript">
function GetServerDateTime(context) ...{
<%= ClientScript.GetCallbackEventReference(this, "", "ReceiveServerData", "")%>;
}
function ReceiveServerData(rValue) ...{
document.getElementById("ResultsSpan").innerHTML = rValue;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="btnSubmit" type="button" value="现在时间是" onclick="GetServerDateTime(ResultsSpan)" />
<br />
<span id="ResultsSpan" runat="server"></span>
</div>
</form>
</body>
</html>
.aspx.cs源代码:
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class CallbackDemo : System.Web.UI.Page,ICallbackEventHandler
...{
protected void Page_Load(object sender, EventArgs e)
...{
}
public void RaiseCallbackEvent(String eventArgument)
...{
}
public String GetCallbackResult()
...{
return DateTime.Now.ToString();
}
}
演示中客户端注册的脚本函数:<%= ClientScript.GetCallbackEventReference(this, "", "ReceiveServerData", "")%>;。这句动态生成一个客户端函数,该函数包含对来自GetCallbackEventReference方法的返回值的调用。ClientScriptManager.GetCallbackEventReference方法有4个重载函数,上面这个方法中,"this"是处理客户端回调的服务器控件,它必须实现ICallbackEventHandler 接口并提供RaiseCallbackEvent 方法,它的类型是System.Web.UI.Control。第二个参数是从客户端脚本传递给服务器的一个参数,它是String类型的。第三个函数是客户端事件处理程序的名称,它接收成功的服务器事件的结果,这里把回调结果返回给JS中的ReceiveServerData()方法。最后一个参数是启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。
JS方法:
document.getElementById("ResultsSpan").innerHTML = rValue;
}
接收服务器事件的结果,并将结果呈现出来。
而服务器端的RaiseCallbackEvent()方法没有内容,因为这里是最简单的演示,我们没有回调参数,如果有回调参数在这个方法中处理。GetCallbackResult()则是返回当前的系统时间。
在VS中测试刚才的DEMO,发现会在浏览器源代码中自动生成一段这样的代码:
这个DEMO产生的WebResource.axd有21KB大小,测试了一下,所有的文件都是一样的体积。它是在这个文件中创建了AJAX请求:
var postData = __theFormPostData +
"__CALLBACKID=" + WebForm_EncodeCallback(eventTarget) +
"&__CALLBACKPARAM=" + WebForm_EncodeCallback(eventArgument);
if (theForm["__EVENTVALIDATION"]) ...{
postData += "&__EVENTVALIDATION=" + WebForm_EncodeCallback(theForm["__EVENTVALIDATION"].value);
}
var xmlRequest,e;
try ...{
xmlRequest = new XMLHttpRequest();
}
catch(e) ...{
try ...{
xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e) ...{
}
}
var setRequestHeaderMethodExists = true;
try ...{
setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);
}
catch(e) ...{}
var callback = new Object();
callback.eventCallback = eventCallback;
callback.context = context;
callback.errorCallback = errorCallback;
callback.async = useAsync;
var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);
if (!useAsync) ...{
if (__synchronousCallBackIndex != -1) ...{
__pendingCallbacks[__synchronousCallBackIndex] = null;
}
__synchronousCallBackIndex = callbackIndex;
}
if (setRequestHeaderMethodExists) ...{
xmlRequest.onreadystatechange = WebForm_CallbackComplete;
callback.xmlRequest = xmlRequest;
xmlRequest.open("POST", theForm.action, true);
xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
xmlRequest.send(postData);
return;
}
callback.xmlRequest = new Object();
var callbackFrameID = "__CALLBACKFRAME" + callbackIndex;
var xmlRequestFrame = document.frames[callbackFrameID];
if (!xmlRequestFrame) ...{
xmlRequestFrame = document.createElement("IFRAME");
xmlRequestFrame.width = "1";
xmlRequestFrame.height = "1";
xmlRequestFrame.frameBorder = "0";
xmlRequestFrame.id = callbackFrameID;
xmlRequestFrame.name = callbackFrameID;
xmlRequestFrame.style.position = "absolute";
xmlRequestFrame.style.top = "-100px"
xmlRequestFrame.style.left = "-100px";
try ...{
if (callBackFrameUrl) ...{
xmlRequestFrame.src = callBackFrameUrl;
}
}
catch(e) ...{}
document.body.appendChild(xmlRequestFrame);
}
var interval = window.setInterval(function() ...{
xmlRequestFrame = document.frames[callbackFrameID];
if (xmlRequestFrame && xmlRequestFrame.document) ...{
window.clearInterval(interval);
xmlRequestFrame.document.write("");
xmlRequestFrame.document.close();
xmlRequestFrame.document.write('<html><body><form method="post"><input type="hidden" name="__CALLBACKLOADSCRIPT" value="t"></form></body></html>');
xmlRequestFrame.document.close();
xmlRequestFrame.document.forms[0].action = theForm.action;
var count = __theFormPostCollection.length;
var element;
for (var i = 0; i < count; i++) ...{
element = __theFormPostCollection[i];
if (element) ...{
var fieldElement = xmlRequestFrame.document.createElement("INPUT");
fieldElement.type = "hidden";
fieldElement.name = element.name;
fieldElement.value = element.value;
xmlRequestFrame.document.forms[0].appendChild(fieldElement);
}
}
var callbackIdFieldElement = xmlRequestFrame.document.createElement("INPUT");
callbackIdFieldElement.type = "hidden";
callbackIdFieldElement.name = "__CALLBACKID";
callbackIdFieldElement.value = eventTarget;
xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);
var callbackParamFieldElement = xmlRequestFrame.document.createElement("INPUT");
callbackParamFieldElement.type = "hidden";
callbackParamFieldElement.name = "__CALLBACKPARAM";
callbackParamFieldElement.value = eventArgument;
xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);
if (theForm["__EVENTVALIDATION"]) ...{
</span
发表评论
-
ASP.net中的cookies读写
2009-07-16 17:09 772Cookie (HttpCookie的实例)提供了一种在 We ... -
有关FCKeditor在asp.net 2.0下的配置问题.
2009-08-03 16:34 963今天配置了一下fckeditor,将这一过程与大家分享.fck ... -
asp.net 获取客户端计算机名
2009-08-09 20:43 23161. 在ASP.NET中专用属性: 获取服务器电脑名:Page ... -
入侵ASP.net网站的经验
2009-10-18 11:19 8211、对一般遇到.net的网站时 通常会注册个用户 第一选择 ... -
vs常用快捷键---提高编码效率
2009-12-04 19:12 9071 转到定义: F12; 2 设置书签:Ctr+K+K; 3 ... -
关于ashx
2009-12-07 21:09 959ashx是什么文件,如何创建 .ashx 文件用于写web ... -
在ASP.NET中实现多文件上传(转)
2010-04-05 11:10 852ASPX 代码 <!--<br /> ... -
在单个页面中实现多个radiobuttonlist的单选
2010-04-11 14:49 862最近做的这个项目 让我对radiobuttonlist的应用有 ... -
MMC不能打开文件SQLServerEnterpriseManager.MSC的解决方法
2010-05-01 11:13 871“开始” —> “运行” —> 键入MMC命令 ... -
json札记
2010-08-28 10:21 758js 中读取JSON的方法探讨 方法一:函数构造定义法返回v ...
相关推荐
标题提到的“基于Ajax+ASP.NET实现的客户端Callback控件源码例子”是一个具体的示例,展示了如何在ASP.NET环境中使用Ajax技术来创建一个客户端回调功能。客户端回调(Client Callback)是ASP.NET提供的一种轻量级的...
此外,ASP.NET AJAX也支持Callback Functions,允许开发者定义在服务器响应完成时执行的回调函数,从而实现更复杂的交互逻辑。 在处理AJAX请求时,还要注意错误处理。ASP.NET AJAX提供了一套完整的错误处理机制,...
在探讨ASP.NET 2.0如何使用Ajax实现客户端回调功能之前,我们首先简要回顾一下ASP.NET 2.0和Ajax的基本概念。 ### ASP.NET 2.0简介 ASP.NET 2.0是Microsoft推出的一个用于开发Web应用程序的框架,它是.NET ...
在ASP.NET中,为了提供更好的用户体验,我们常常需要实现无刷新分页功能,这可以通过结合Jquery、Ajax和Json技术来实现。这篇文章将详细介绍如何在ASP.NET中利用这些技术进行无刷新分页的实例。 首先,我们需要理解...
在ASP.NET中,AJAX(Asynchronous JavaScript and XML)技术被广泛使用,以提供无刷新的用户体验,提高网页的响应速度和用户交互性。这个压缩包文件"ASP.NET常用AJAX实例"很可能包含了一些实际应用中的AJAX控件和...
随着ajax技术的流行以及用户体验得到越来越高的重视,各种注视用户体验的程序出现,比如带进度条的文件上传,看了网上很多资料还没找到真正意义上的ASP.NET实现进度条上传.Ajax 文件上传进度条,ASP.NET 文件上传...
在ASP.NET中,你也可以使用`PageMethods`和`WebMethods`来实现基于URL的AJAX请求。`PageMethods`是ASP.NET AJAX库的一部分,允许你在脚本中直接调用页面上的静态Web方法。而`WebMethods`是在页面代码后面声明的静态...
在本例中,我们将深入探讨如何在ASP.NET环境中使用回调。 标题中的"asp.net 使用 回调例子"指的是一个具体的示例,它展示了如何在ASP.NET应用中实施回调功能。回调的基本原理是利用JavaScript和服务器端的交互,...
UpdatePanel是ASP.NET AJAX中最常用的控件,用于实现无刷新更新。它可以将一个或多个控件包装起来,当这些控件触发事件时,只有UpdatePanel内的内容会被异步更新,而无需刷新整个页面。 5. **ScriptManager**: ...
读者将学习到如何在ASP.NET中集成Ajax功能,如使用ASP.NET AJAX Toolkit,这是一个包含大量预构建Ajax控件和扩展的库,能够帮助开发者快速构建功能丰富的页面。 此外,书中的章节还将涵盖使用UpdatePanel、...
如果跨域通信是必需的,ASP.NET MVC和Web API都支持JSONP(JSON with Padding),通过设置`JsonRequestBehavior.AllowGet`和添加`callback`参数即可实现。 8. 性能优化 对于大量数据传输,可以启用GZip或Deflate...
在ASP.NET 2.0中,引入了一种新的技术,即客户端回调(Client Callback)机制,也称为 Partial Page Rendering 或 UpdatePanel,这使得开发者能够实现无刷新页面更新,提高用户体验。 客户端回调机制的核心是通过...
这些组件简化了在ASP.NET应用中实现AJAX功能的过程。例如,UpdatePanel可以将一部分页面放在一个异步更新的区域中,而ScriptManager则是协调客户端和服务器端AJAX功能的关键组件。 **ASP.NET与AJAX的结合使用** 1....
2. **UpdatePanel**:UpdatePanel是ASP.NET AJAX中最常用的控件之一,它允许在后台异步更新页面的一部分,实现局部刷新。通过在UpdatePanel内放置其他控件,可以实现这些控件的无刷新更新。 3. **ScriptManager**:...
在Asp.NET中,可以使用Microsoft AJAX库,包括ScriptManager控件和AJAX方法,如PageMethods或WebServices,来实现回调。 2. **UpdatePanel控件**:这是ASP.NET AJAX Control Toolkit的一部分,它允许在不完全刷新...
- **Callback**:ASP.NET AJAX中的回调机制允许客户端发送请求到服务器,服务器处理请求后只返回必要的数据,而不是整个页面。 - **Partial Page Rendering**:这是ASP.NET AJAX的核心特性,它减少了网络传输的数据...
在Visual Studio 2005(VS2005)中集成ASP.NET AJAX,可以极大地提升开发人员的效率,通过异步处理,改善用户体验,使得网页无需刷新即可更新部分内容。 **一、ASP.NET AJAX的核心组件** 1. **MicrosoftAjax.js**: ...
4. **Timers**:在ASP.NET AJAX中,Timer控件用于定期触发事件,实现周期性的页面更新或执行服务器端操作。这在实时应用中非常常见,如股票报价或在线计时器。 5. **jQuery与ASP.NET AJAX的结合**:虽然ASP.NET ...
- **CallbackRefresh**:利用ASP.NET 2.0的回调特性实现局部刷新。 - **IframeRefresh**:通过嵌入iframe的方式实现局部刷新。 - **JsRefresh**:纯JavaScript方式实现局部刷新。 **第4章:CSS制作方法** - **...
在ASP.NET环境中,我们可以借助zTree实现动态数据加载,提升用户体验。本文将深入探讨如何在ASP.NET项目中应用`jQuery zTree`。 首先,我们需要在项目中引入`jQuery zTree`的相关文件。这包括CSS样式文件和...