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对象了.后面就不说了.
Asp.Net--回调技术的更多相关文章
- ASP.NET 回调技术(CallBack)
在asp.net中客户端与服务器端的交互默认都是整页面提交, 此时客户端将当前页面表单中的数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器重新实例化一个当前页面类的实例响应这个请求,然后将整个 ...
- Asp.net回调技术Callback学习
.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.a ...
- 【ASP.NET 基础】Page类和回调技术
Page 类有一个 IsPostBack 属性,这个属性用来指示当前页面是第一次加载还是响应了页面上某个控件的服务器事件导致回发而加载. 1.asp.net页面的声明周期 asp.net页面运行的时候 ...
- Android中的接口回调技术
Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...
- Asp.NET MVC 技术参考:http://kb.cnblogs.com/zt/mvc/
Asp.NET MVC 技术参考:http://kb.cnblogs.com/zt/mvc/
- asp.net-缓存技术-20180409
asp.net缓存技术有三种 1.页面输出缓存 2.页面部分缓存 3.页面数据缓存 ---------------------------------------------------------- ...
- ASP.NET WebApi技术从入门到实战演练
一.课程介绍 曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不会,那么千万万门RPC技术将都不会!在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, An ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...
- 简读《ASP.NET Core技术内幕与项目实战》之3:配置
特别说明:1.本系列内容主要基于杨中科老师的书籍<ASP.NET Core技术内幕与项目实战>及配套的B站视频视频教程,同时会增加极少部分的小知识点2.本系列教程主要目的是提炼知识点,追求 ...
随机推荐
- jQuery.YesShow - 图片轮播插件(带图片放大功能)
jQuery.YesShow - 图片轮播插件(带图片放大功能) 使用简单,原文件只要这样就可以了:<div id="yes"> <ul> ...
- 国内开源html5游戏引擎全收录
本文引自<国内开源html5游戏引擎全收录> 游戏开发这潭水太深,英文水平太差,不敢看国外的, 而且这几年国内技术水平也挺高了不少,特别是JS方面.(我个人感觉) 最近看了几个国产的js游 ...
- Thinkphp 模版
1.显示模版 在Home/Controller/MainController.class.php中写一个方法来显示对应的模版 function text() { //变量输出 $this->as ...
- Hibernate数据库对象的创建与导出
Hibernate 与数据库的关系是ORM关系,对象映射数据库. 那么如何通过对象对数据库进行各种对象的ddl与dml操作呢? 数据库对象操作的〈database-object /〉+ SchemaE ...
- 【学习笔记】【oc】类和对象及类的三大基本特征
1.类和对象 类是抽象化,对象是具体化. (1)定义类: 分为两个步骤,类的声明:定义类的成员变量和方法:@interface 用于声明定义类的接口部分,@end表面定义结束:. 成员变量的定义:{} ...
- 使用国内镜像更新sdk方法
使用国内的镜像资源: 1.mirrors.neusoft.edu.cn //东软信息学院 2.ubuntu.buct.edu.cn/ubuntu.buct.cn //北京化工大学 3.mirrors. ...
- 如何获取网站icon
获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon(<link rel="shortcut ico ...
- Oracle 客户端 NLS_LANG 的设置(转)
1. NLS_LANG 参数组成NLS_LANG参数由以下部分组成:NLS_LANG=<Language>_<Territory>.<Clients Characters ...
- 【转】s3c2440 按键驱动 — 字符设备
原文网址:http://www.xuebuyuan.com/632893.html 主机:VM - redhat 9.0 开发板:FL2440,linux-2.6.12 arm-linux-gcc:3 ...
- linux c 之signal 和sigaction区别
http://blog.csdn.net/muge0913/article/details/7331129 要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数.可以对一个特定的信号(除去 ...