您的位置:首页 > 编程语言 > ASP

基于.NET 2.0的GIS开源项目SharpMap分析手记(十四):ASP.NET2.0实现无刷新客户端回调的Callback机制及例子代码下载

2008-05-07 20:52 1276 查看
基于.NET 2.0的GIS开源项目SharpMap分析手记(十四):ASP.NET2.0实现无刷新客户端回调的Callback机制及例子代码下载
粟卫民 http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:2008-5-7
保留所有版权。如需转载,请联系作者,并在醒目位置注明出处
网上关于ASP.NET2.0 Callback的介绍已经很多了,但是全面系统讲述并带有示例的还比较少。正好这几天在研究SharpMap的AjaxMap控件,就搜集和整理了这方面的资料。为了方便大家的学习,同时节省大家搜集和阅读资料的时间,我就写了这篇博文,希望不是画蛇添足,呵呵。其中可能会摘引一些其它文章的段落(称为“杂文”^-^),在此表示感谢,如果作者觉得我侵犯了版权,请联系我修改删除。

1 Postback VS Callback

1.1 ASP.NET1.1中的Postback机制
在asp.net1.1中,我们知道每个服务器控件都有一个AutoPostback属性。它的作用是当用户(客户端)修改该控件的值,即也可以说是当该控件的事件触发的时候,客户端就通过JavaScript:__doPostback(object,EventArgument)来和服务端实现通信。它使得程序员在实现动态的获取服务端数据变得非常方便。例如:有一个查询成绩的页面,由一个DrowDownlist和一个DataGrid来实现。其中DropDownlist从服务绑定所要查看的学期(2003-2004上半学期,2003-2004下半学期等),DataGrid而是用来显示他在改学期所有科目的成绩,和该学科的学分。在ASP.NET1.1中我们最常使用的方法也就是将DrowDownlist的AutoPostback属性设置为True,并把该事件触发服务端后台的某个方法,该方法获取所选择的学期的id号,然后去数据库获得DataTable重新绑定与DataGrid并将它显示出来。在这整个过程中,作为用户肯定是要经历一个刷新页面的过程。如果仅像刚才那个例子所说这个刷新不会很大的影响用户的Experience,不过如果你有一个复杂的填写表单的页面,该页面有大量的Control是相关的,需要更据其它Control的选择情况去动态的绑定数据,那当用户填完这个表单的时候也许眼睛也花了,他也许再也不想经历如此痛苦的折磨了,从Experience方面来讲将是非常差的。在不是从服务端获取大量数据的情况下,我们要如何才能避免这种在用户看似多余的Postback呢?
1.2 ASP.NET2.0中新功能Script Callback介绍
在ASP.NET2.0中,客户端的脚本功能已经被扩展了。并且增加了Script Callbacks(通过脚本建立于后台的链接,后文将其翻译为客户端呼叫)。你可以用程序去控制<head>标签,通过程序控制input焦点,读取或者设置页面的标题,并且可以控制button或其他的控件提交到其他任何页面(in the application)。具体您可以查看Beta 1 说明,里面有例子和参考。
为了使用ASP.NET2.0中的客户端呼叫技术,你需要在页面中定义一个触发元件(不是提交按钮Submit button)并且把它绑定上JavaScript代码。这段代码会重新获得当前页面的input数据并且准备去呼叫系统提供的一个称为WebForm_DoCallback的Script函数(Beta1)。这个函数会建立一个和一个指定的远程ASP.NET页面建立HTTP连接。后台侦听到这个来自客户端的呼叫后呢,对此触发一个方法。服务端通过先前的客户端的函数返回一个值。在客户端,通过一个用户自定义的脚本函数来获得服务端的值并且用DHTML将其呈现在页面上。重要的是,这样做客户端和服务端的通信仍旧在进行,但是页面并没有重新刷新。更重要的是,当客户端在获取数据的时候用户仍旧可以在它原来的页面上操作。

2 Callback VS Atlas

我们再来谈谈Atlas。很多朋友可能会觉得奇怪,已经有Callback,为什么又要出Atlas呢?关于这个问题,Atlas的作者怎么解释,我倒没有去调查。只不过从我个人对callback和atlas的使用感受来讲,觉得,callback作为一个接口和postback非常类似的实现,肯定是为了让用户类似使用postback来使用它。但是,它的这个类似postback的机制,应该说使用上还不是特别方便,也不易扩展,当然这是相比于其他的 AJAX框架实现来说的。因此,微软方面借鉴了许多的已有的AJAX实现,如Prototype,Backbase以及AJAX.NET,并结合 ASP.NET2.0的部分特有功能,发明了这样一个博采众长的AJAX框架。基于Atlas来开发AJAX应用有多好,很难量化的来说,但至少不比其他的这些AJAX框架来的差是肯定的,加上微软这个后台,以及像live.com这样的重量级站点的应用推广,其影响当然是值得期待的。
不过,这也不是说Callback实现没一无是处了,作为程序员,我们需要有正确的态度,在正确的使用情形,使用最正确的技术。没有哪一个框架是万能的,是适合任何使用环境的;就像大家都在争论那个软件开发方法最好,CMMi,RUP,XP,AGILE~~,其实,没有最好,最合适的才是最好的。我们最应该做的,是了解各种方案的原理和优缺点,从而,合理的使用正确的工具来解决实际问题。Callback的好处就是简单,在Asp.net 2.0不需要额外的支持。

3 Callback原理

Callback可以翻译成“客户端回调”。在期望不执行Postback而从客户端调用服务器代码的情况下,可以使用 ClientScriptManager 类来调用客户端回调。这称为对服务器执行带外回调。在客户端回调中,客户端脚本函数向 ASP.NET 网页发送异步请求。网页修改其正常生命周期来处理回调。
回调的过程如下所示:
1)客户端发出请求,请求内容包括:指定更新控件和传递参数。
2)服务端响应、处理。
3)服务端将处理后的内容以字符串返回。
4)客户端使用一个函数接受返回值
5)客户端更新指定控件。
创建实现客户端回调的 ASP.NET 页,必须实现ICallbackEventHandler接口。
先声明该接口,方法如下:
public partial class CallBackExample
: System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{… …}
 实现ICallbackEventHandler接口的两个固定名称的方法, RaiseCallbackEvent(eventArgment)和GetCallbackResult()。RaiseCallbackEvent()方法是回调执行的方法,在这个方法中处理回调的内容,它没有返回值,它从浏览器接受一个字符串作为事件参数,即该方法接受客户端JavaScript使传递的参数,注意它是首先触发的。接下来触发的就是GetCallbackResult()方法,它将所得到的结果传回给客户端的JavaScript,JavaScript再将结果更新到页面。
客户端使用ClientScript.GetCallbackEventReference()方法实现回调。这个方法用几个参数其中一个指定关联上下文,一个指定返回客户端的函数名称。
Public string GetCallbackEventReference (Control control,string argument,string clientCallback,string context)
参数与返回值说明:

参数
作用
control
处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
argument
从客户端脚本传递一个参数到服务器端的RaiseCallbackEvent 方法。
clientCallback
一个客户端事件处理程序的名称,该处理程序接收服务器端事件返回的结果。
context
启动回调之前在客户端的客户端脚本信息。脚本的结果传回给客户端事件处理程序。
返回值
调用客户端回调的客户端函数的名称。
 注意:ClientScript.GetCallbackEventReference()方法在客户端必须有控件来调用,调用的控件不是我们经常使用的服务器端控件,而是一个HTML元素。在控件中添加一个onclick事件,点击该按钮这将向服务器端发出回调请求。
下面是ClientScriptManager.GetCallbackEventReference 方法的重载列表

名称
说明
ClientScriptManager.GetCallbackEventReference (Control, String, String, String)
获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文。
ClientScriptManager.GetCallbackEventReference (Control, String, String, String, Boolean)
获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本、上下文和布尔值。
ClientScriptManager.GetCallbackEventReference (Control, String, String, String, String, Boolean)
获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本、上下文、错误处理程序和布尔值。
ClientScriptManager.GetCallbackEventReference (String, String, String, String, String, Boolean)
获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的目标、参数、客户端脚本、上下文、错误处理程序和布尔值。 我们就整个程序作个系统的说明,并且列出前台的页面代码和后台的逻辑代码,这样可以使得你对程序有个直观的理解。

4 示例

在后台写个public string,在Page_Load中给他赋值为:=Page.ClientScript.GetCallbackEventReference(this, "message", "ShowServerTime", "context");注意在这里是Page.ClientScrip,因为他会返回个ClientScriptManager,ClientScriptManager管理所有的客户端脚本。然后在前台某个按钮的onclick事件里<%=那个public后台字符串%>.做个小实验代码如下:
前台ServerTime.aspx:为了方便去掉好多没用的html

<%@ page language="C#" CodeFile="ServerTime.aspx.cs" Inherits="ServerTime_aspx" %>
<html>
<head>
<title>Server Time</title>
<script language="javascript">

function GetServerTime()
{
 var message = '';
 var context = '';
 <%=sCallBackFunctionInvocation%>
}

function ShowServerTime(timeMessage, context) {
 alert('现在服务器上的时间是:/n' + timeMessage);
}
</script>
</head>
<body>
<form id="MainForm" runat="server">
<input type="button" value="得到服务器端时间" onclick="GetServerTime();" />
</form>
</body>
</html>
  后台:

using System;
using System.Web.UI;

public partial class ServerTime_aspx : Page,ICallbackEventHandler
{
 //一定要实现ICallbackEventHandler借口
 public string sCallBackFunctionInvocation;

 void Page_Load(object sender, System.EventArgs e)
 {
  sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, "message", "ShowServerTime", "context");
 }

 public string RaiseCallbackEvent(string eventArgument)
 {
  return DateTime.Now.ToString();
 }
}
运行,点按钮结果如下:




此例子的代码下载请点击此处

参考文献
【1】深度解析Asp.Net2.0中的Callback机制,
http://teddyma.cnblogs.com/archive/2005/11/28/286196.html
【2】和Postback说再见,http://www.chinadforce.com/viewthread.php?tid=625282
【3】ASP.NET2.0实现无刷新客户端回调,
http://tech.163.com/05/1116/15/22MJS8FK0009159F.html
【4】ASP.NET实现回调实现的步骤,http://www.xinoa.cn/webkaifa/ASPNET/200709/339.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐