粟卫民ID:suen
126568次访问,排名607好友25人,关注者70
suen的文章
原创 35 篇
翻译 5 篇
转载 41 篇
评论 58 篇
小粟的公告
终于完成GeoWeb开源社区(http://www.gisdev.cn)的搭建和初步测试,请大家注册用户,测试,并提出宝贵意见。
最近评论
suen:再推荐两篇不错的参考文献:
(1) ASP.NET 2.0 Callback实例讲解,http://blog.csdn.net/lxjhb/archive/2007/11/09/1875968.aspx
(2)深度解析Asp.Net2.0中的Callback机制,http://www.cnblogs.com/orin-chan/archive/2005/12/13/296……
phdbrianlee:on the fly--怎么能翻译成“飞行时”?
它在这里是“实时、即时、在线”的意思,在英文中常对应offline。
wf0522:不错,很适合初学者
momolulu:域名和空间已经开通,www.helpwenchuan.com
基于google map 来做,现在需要有热情,有爱心的能够一起合作的志愿者.
suen:最近全国人民都在关心四川的这次大地震,我们GeoWeb开源社区(http://www.gisdev.cn)也专门开辟了一个版块来作为爱心版块。大家可以在这里(http://www.gisdev.cn/showforum-24.aspx)发帖说出自己愿意为灾区做什么,然后留下自己的联系方式。
我来带个头:
我愿意:
(1)捐出自己的一些旧衣物;
(2)收……
文章分类
收藏
    相册
    我的照片
    GIS
    .NET开源GIS翻译WiKi
    GeoWeb开源社区
    GIS空间站
    GIS论坛
    中科院地理所
    国家测绘局
    我的旧BLOG归档
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

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

    新一篇: OpenLayers项目分析[转](一):项目介绍 | 旧一篇: 基于.NET 2.0的GIS开源项目SharpMap分析手记(十三):基于SharpMap的Windows程序界面(C/S架构)

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

    粟卫民  http://www.gisdev.cn/   http://blog.csdn.net/suen/ 日期:2008-5-7

    保留所有版权。如需转载,请联系作者,并在醒目位置注明出处

    网上关于ASP.NET2.0 Callback的介绍已经很多了,但是全面系统讲述并带有示例的还比较少。正好这几天在研究SharpMapAjaxMap控件,就搜集和整理了这方面的资料。为了方便大家的学习,同时节省大家搜集和阅读资料的时间,我就写了这篇博文,希望不是画蛇添足,呵呵。其中可能会摘引一些其它文章的段落(称为“杂文”^-^),在此表示感谢,如果作者觉得我侵犯了版权,请联系我修改删除。

    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中我们最常使用的方法也就是将DrowDownlistAutoPostback属性设置为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_DoCallbackScript函数(Beta1)。这个函数会建立一个和一个指定的远程ASP.NET页面建立HTTP连接。后台侦听到这个来自客户端的呼叫后呢,对此触发一个方法。服务端通过先前的客户端的函数返回一个值。在客户端,通过一个用户自定义的脚本函数来获得服务端的值并且用DHTML将其呈现在页面上。重要的是,这样做客户端和服务端的通信仍旧在进行,但是页面并没有重新刷新。更重要的是,当客户端在获取数据的时候用户仍旧可以在它原来的页面上操作。

    2 Callback VS Atlas

    我们再来谈谈Atlas。很多朋友可能会觉得奇怪,已经有Callback,为什么又要出Atlas呢?关于这个问题,Atlas的作者怎么解释,我倒没有去调查。只不过从我个人对callbackatlas的使用感受来讲,觉得,callback作为一个接口和postback非常类似的实现,肯定是为了让用户类似使用postback来使用它。但是,它的这个类似postback的机制,应该说使用上还不是特别方便,也不易扩展,当然这是相比于其他的 AJAX框架实现来说的。因此,微软方面借鉴了许多的已有的AJAX实现,如PrototypeBackbase以及AJAX.NET,并结合 ASP.NET2.0的部分特有功能,发明了这样一个博采众长的AJAX框架。基于Atlas来开发AJAX应用有多好,很难量化的来说,但至少不比其他的这些AJAX框架来的差是肯定的,加上微软这个后台,以及像live.com这样的重量级站点的应用推广,其影响当然是值得期待的。

    不过,这也不是说Callback实现没一无是处了,作为程序员,我们需要有正确的态度,在正确的使用情形,使用最正确的技术。没有哪一个框架是万能的,是适合任何使用环境的;就像大家都在争论那个软件开发方法最好,CMMiRUPXPAGILE~~,其实,没有最好,最合适的才是最好的。我们最应该做的,是了解各种方案的原理和优缺点,从而,合理的使用正确的工具来解决实际问题。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()方法,它将所得到的结果传回给客户端的JavaScriptJavaScript再将结果更新到页面。

        客户端使用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

    titleServer 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

    3ASP.NET2.0实现无刷新客户端回调,

    http://tech.163.com/05/1116/15/22MJS8FK0009159F.html

    4ASP.NET实现回调实现的步骤,http://www.xinoa.cn/webkaifa/ASPNET/200709/339.html

     

    发表于 @ 2008年05月07日 20:52:09|评论(loading...)|编辑

    评论

    #suen 发表于2008-07-17 22:34:08  IP: 222.244.254.*
    再推荐两篇不错的参考文献:
    (1) ASP.NET 2.0 Callback实例讲解,http://blog.csdn.net/lxjhb/archive/2007/11/09/1875968.aspx
    (2)深度解析Asp.Net2.0中的Callback机制,http://www.cnblogs.com/orin-chan/archive/2005/12/13/296567.html
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 小粟