Asp.Net--回调技术
实现回调技术需要以下步骤:
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" onblur="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&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" onblur="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&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对象了.后面就不说了.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。