在ASP.NET中客户端与服务器端的交互默认都是整页面提交,此时客户端将当前页面表单中的数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器重新实例化一个当前页面类的实例响应这个请求,然后将整个页面的内容重新发送到客户端,这种处理方式对运行结果没什么影响,不过这种方式加重了网络的数据传输负担、加大了服务器的工作压力,并且客户还要等待最终处理结果、如果仅仅处理页面中的部分数据,可以使用AJJAX技术来实现,也可以使用回调技术实现。
实现要点:(1)实现System.Web.UI.ICallbackEventHandler接口中的方法RaiseCallbackEvent()和GetCallbackResult()
(2)给控件添加客户端调用方法
(3)编写客户端调用服务器方法成功和出现异常时,要执行的客户端方法
(4)编写回调处理的代码
1、添加客户端调用方法
- <div>
- <%--当文本框失去焦点时--%>
- 用户名:<asp:TextBox ID="txtName" runat="server" onblur="CallServerMethod(txtName.value,null)"></asp:TextBox ><span id="message"></span>
- <br />
- 密 码:<asp:TextBox ID="txtPwd" runat="server"></asp:TextBox>
- </div>
2、客户端调用服务器方法成功和出现异常时的方法
- <script type="text/javascript" language="javascript">
- //客户端执行的方法
- //下面的方法是接收并处理服务器方法执行返回的结果
- function Success(args, context) {
- message.innerText = args;
- }
- //下面的方式是当接收服务器方法处理的结果发生异常时调用的方法
- function Error(args, context) {
- message.innerText = "发生了异常";
- }
- </script>
3、后台代码
- public partial class 回调技术 : System.Web.UI.Page, ICallbackEventHandler
- {
- string result = "";
- //定义在服务器端运行的回调方法
- public void RaiseCallbackEvent(string eventArgument)
- {
- if (eventArgument.ToLower().IndexOf("admin") != -1)
- {
- result = eventArgument + " 不能作为用户名注册";
- }
- else
- {
- result = eventArgument + "可以注册";
- }
- }
- //定义返回回调方法执行结果的方法
- public string GetCallbackResult()
- {
- return result;
- }
- //服务器上执行的方法
- protected void Page_Load(object sender, EventArgs e)
- {
- //获取当前页的ClientScriptManage的引用
- ClientScriptManager csm = Page.ClientScript;
- //获取回调引用,会在客户端生成WebForm_DoCallback方法,调用它来达到异步调用
- //注意这里的“success”和“error”两个字符串分别客户端代码中定义的两个javascript函数
- //下面的方法最后一个参数的意义:true表示执行异步回调,false表示执行同步回调
- String reference = csm.GetCallbackEventReference(this,"args","Success","","Error",true);
- String callbackscript = "function CallServerMethod(args,context) {\n"+reference+"\n}";
- //回当前页面注册javascript脚本代码
- csm.RegisterClientScriptBlock(this.GetType(),"CallServerMethod",callbackscript,true);
- }
- }