Hopes

Start Here..

 

回调等。

网上关于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"clientscript messag string;, "ShowServerTime", "context");注意在这里是Page.ClientScrip,因为他会返回个ClientScriptManager,ClientScriptManager管理showservertim clientscrip context所有的客户端脚本。然后在前台某个按钮的onclick事件里<%=那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();
 }
}

posted on 2014-01-08 21:28 ** 阅读(111) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

公告

你好!

常用链接

留言簿(2)

随笔档案

文章分类

文章档案

新闻档案

相册

收藏夹

C#学习

友情链接

搜索

最新评论

阅读排行榜

评论排行榜