实现回调技术需要以下步骤:

1.实现ICallbakEventHandler

2.实现接口中的方法:RaiseCallbackEvent

3.实现GetCallbackResult

方法 解释 参数
void RaiseCallbackEvent(string eventArgument) 处理以控件为目的的回调事件 表示要传递到事件处理程序的事件参数
string GetCallbackResult() 返回以控件为目的的回调事件的结果  

先看例子,再来解释:

1.建立一个aspx页面,内容如下:

页面代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>无标题页</title>
</head>
<body><form id="form1" runat="server"><input type="text" id="txtname" name="txtname" οnblur="CallServer(this.value,null)" /><span id="msg"></span><input type="submit" value="Submit" /><script type="text/javascript">function Success(args,context){document.getElementById("msg").innerText=args;}function Error(args,context){document.getElementById("msg").innerText=args;}</script></form>
</body>
</html>
此处,并没有看到定义了CallServer函数,也没有看到有调用Success和Error的地方.且看后台.
实现ICallbackEventHandler接口.
后台代码:
    protected void Page_Load(object sender, EventArgs e){string reference = Page.ClientScript.GetCallbackEventReference(this, "args", "Success", "", "Error", false);string callbackscript = "function CallServer(args,context){\n" +reference + ";\n}";Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callback", callbackscript, true);}public string GetCallbackResult(){return ViewState["result"].ToString();}public void RaiseCallbackEvent(string eventArgument){if (eventArgument.Equals("admin")){ViewState["result"] = "不可以被使用!";}else{ViewState["result"] = "可以使用";}}

此时,看到了关于Page.ClientScript.GetCallbackEventReference的使用,同时也看到了CallServer方法的定义.且看GetCallbackEventReference方法的定义:

GetCallbackEventReference:获取一个对客户端参数的引用;调用该函数时,将启动一个对服务器事件的回调.即:返回一个函数,该函数是可以将页面提交到服务器.

其中,在例子中使用的函数参数的解释如下:

GetCallbackEventReference(Control control,string argument,string clientcallback,string context,string clientErrorcallback,bool useAsync)

control:处理客户端回调的服务器Control.

argument:一个参数,该参数从客户端脚本传递给服务器的RaiseCallbackEvent事件.

clientCallback:一个客户端函数,用于处理当事件成功运行时的函数

context:启动回调之前,在客户端计算的客户端脚本,脚本的结果传递给事件处理程序.

clientErrorcallback:一个客户端函数,用于处理当事件失败时运行的函数.(本例中虽然有该参数,但是实际上并未使用)

useAsync:true表示异步执行回调,false表示同步执行回调

运行页面,查看效果,是否发现,页面在进行用户判断时不再进行整页的刷新.

页面执行流程如下:

1.当textbox失去焦点时,调用CallServer方法

2.CallServer方法将this.value值传入RaiseCallbackEvent方法的参数中,然后进行判断,随后调用GetCallbackResult()方法

3.此时,再执行页面中定义的Success方法.

查看运行页面的源代码,形成的客户端HTML代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>无标题页
</title></head>
<body><form name="form1" method="post" action="Default2.aspx" id="form1">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGS4em2NMZLtsU4YN7EFuXT4tLpJrA==" />
</div><script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {if (!theForm.onsubmit || (theForm.onsubmit() != false)) {theForm.__EVENTTARGET.value = eventTarget;theForm.__EVENTARGUMENT.value = eventArgument;theForm.submit();}
}
//]]>
</script><script src="/kongjian/WebResource.axd?d=KYfh-S4VutWcM_01AnkeqQ2&amp;t=633934581566718750" type="text/javascript"></script><script type="text/javascript">
//<![CDATA[
function CallServer(args,context){
WebForm_DoCallback('__Page',args,Success,"",Error,false);
}//]]>
</script><input type="text" id="txtname" name="txtname" οnblur="CallServer(this.value,null)" /><span id="msg"></span><input type="submit" value="Submit" /><script type="text/javascript">function Success(args,context){document.getElementById("msg").innerText=args;}function Error(args,context){document.getElementById("msg").innerText=args;}</script><script type="text/javascript">
//<![CDATA[WebForm_InitCallback();//]]>
</script>
</form>
</body>
</html>

注意页面中这段代码:

<script type="text/javascript">
//<![CDATA[
function CallServer(args,context){
WebForm_DoCallback('__Page',args,Success,"",Error,false);
}//]]>
</script>
此段代码正是在pageload事件中生成的
    protected void Page_Load(object sender, EventArgs e){string reference = Page.ClientScript.GetCallbackEventReference(this, "args", "Success", "", "Error", false);string callbackscript = "function CallServer(args,context){\n" +reference + ";\n}";Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "callback", callbackscript, true);}

此时,再来看WebForm_DoCallback方法.

将源代码中一段script代码下下来./kongjian/WebResource.axd?d=KYfh-S4VutWcM_01AnkeqQ2&amp;t=633934581566718750

查找其中的WebForm_DoCallback方法代码,简单列出一部分:

    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;

看到这段代码,会发现,原来已经建立的xmlHttpRequest对象了.后面就不说了.

转载于:https://www.cnblogs.com/loveYN/p/4509668.html

Asp.Net--回调技术相关推荐

  1. asp.net夜话之五:Page类和回调技术

    asp.net夜话之五:Page类和回调技术 在今天我主要要介绍的有如下知识点: Page类介绍 Page的生命周期 IsPostBack属性 ClientScriptManager类 回调技术(Ca ...

  2. ASP.NET中的回调技术(CallBack)

    在asp.net中客户端与服务器端的交互默认都是整页面提交,此时客户端将当前页面表单中的数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器重新实例化一个当前页面类的实例响应这个请求,然后将整个页 ...

  3. 低调的华丽:从服务器开发的角度认识 asp.net 中的回调技术

    谈到异步调用,大家第一反应就是 ajax.这没有错,毕竟这是一个 ajax 的时代,ajax 以它最令人兴奋的客户端体验被大家普遍使用到 Web 开发中来.然而,我们知道,ajax 的本质仍是 Jav ...

  4. 使用回调技术实现局部刷新

    使用回调技术实现局部刷新,它只要是实现了ICallbackEventHandler这个接口,使用接口中的RaiseCallbackEvent        事件和GetCallbackResult() ...

  5. ASP.NET WebApi技术从入门到实战演练

    一.课程介绍 曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不会,那么千万万门RPC技术将都不会!在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, An ...

  6. C#发现之旅第九讲 ASP.NET验证码技术

    C#发现之旅第九讲 ASP.NET验证码技术 袁永福 2008-5-15 系列课程说明     为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅"的技术讲 ...

  7. 本周ASP.NET英文技术文章推荐[10/21 – 10/27]

    这一篇是<本周ASP.NET英文技术文章推荐>系列的第一篇,在这个系列中,我将介绍5-10篇比较有价值的.本周发布的.与ASP.NET相关的英文技术文章,帮助各位朋友从良莠不齐的大量文章中 ...

  8. 上周ASP.NET英文技术文章推荐[05/06 - 05/12]

    这是Dflying Chen 在上周推荐的英文文章,感觉很不错,可以一直没看完,记个笔记.别忘记了看. 本周ASP.NET英文技术文章推荐[05/06 - 05/12] 摘要 本期共有9篇文章: 强大 ...

  9. 用Dreamweaver+ASP实现分页技术的参考

    今天心情有点激动,想把"关于用DW+ASP实现分页技术的参考"分享给用DW+ASP做网页的朋友们.去掉只有"第一页,前一页,下一页,最后一页"的小痛苦 . 此效 ...

  10. 【收藏】ASP.NET英文技术文章推荐[10/28 – 11/3]

    [1]PHP on IIS7 w/FastCGI(IIS7中的PHP和FastCGI模块) 最新版本的IIS 7.0即将随着Windows Vista一同发布,在极大增强了其主要支持的ASP.NET功 ...

最新文章

  1. 【C++】stack的部分使用(之后会不定时进行更新)
  2. Redis-11使用 watch 命令监控事务
  3. 电力系统分析课设短路电流计算simulink仿真
  4. java 数据库数据写接口_Java读取接口数据并保存到数据库
  5. 转:PHP 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
  6. django构建网页_如何使用Django构建照片供稿
  7. mysql数据库代码_【代码总结】MYSQL数据库的常见操作
  8. fread 和 read的区别
  9. linux mysql 集群安装配置_linux下mysql集群的安装
  10. Exchange2003/2010共存模式环境迁移
  11. android - 房源登记模版
  12. Python抓取必应搜索背景图片
  13. CSS3时光流逝效果
  14. 【华为机试】鸡蛋放在篮子里
  15. 分分钟安装VMware,并安装linux操作系统
  16. matlab求解外推法和黄金分割法
  17. 02#EXCEL函数【基础】
  18. 安装redis时被意外攻击 newinit
  19. (附源码)计算机毕业设计SSM基于框架的旅游管理系统
  20. android 里面的颜色的RGB

热门文章

  1. bat脚本 -- 初步接触
  2. 蓝桥杯 ADV-12 算法提高 计算时间
  3. [Java] 蓝桥杯ADV-102 算法提高 单词个数统计
  4. Oracle的取整和四舍五入函数——floor,round,ceil,trunc使用说明
  5. Python性能测试方法
  6. Informix常用操作方法命令
  7. SpringSecurity应用(一)
  8. Educational Codeforces Round 52E(构造,快速幂)
  9. Java优先队列 Priority Queue
  10. CentOS 6下SSH限制IP和用户登录