** Whidbey ** ** 对客户端回调的简化 ** ** **
有很多理由让我期待 vs.net 的下一个版本: Whidbey ,其中之一就是增加了很多对客户端脚本的支持。包含了新的属性和一个 ClientScriptManager 类来管理客户端脚本。然而, 也许最受欢迎的就是 Whidbey 支持 回调远程服务器正在使用的 客户端脚本 。
图 1. 回调的流程: 当它被服务器和客户端两者处理时,你可以控制回调的流程
|
---|---
|
通过刷新或回发提交一个页面来 实现数据查询是一项很平常的技术。使用asp时,开发者使用脚本来控制客户端提交的数据,但这样通常使得asp代码很难进行维护。像大多数的 Web applications ,对服务器以提交回发形式提交数据引起一个完全的请求- 回应周期,服务器会生成一个完全新的页来回应请求, 然后浏览器会生成新的页以代替已存在的页。页面重绘( page-redrawing )使得使用者得到服务器的回应的数度变得很慢。 开发者减轻这种问题的接口问题的一个方法是藉由使用远程脚本( remote scripting ),这种远程脚本使用包含 Java applets 的 DHTML 组合在已存在的页面上动态生成向服务器更新数据的请求。
除此之外,开发者还可以使用(只适用于IE请求)客户端脚本和 XMLHttp 向服务器后台数据发出请求。
但是这两个方法的实现时很困难的,这需要非常的细心和努力,尤其是编译。
开发者期待在最初 ASP.NET release 版本 中得到一些变化,他们得到一些,如: 服务器控件、 ViewState ,自动回发( Automated postback )以及基于事件的 ASP.NET 编程模型解决了许多问题。尤其是 SmartNavigation( 仅仅在 IE 应用程序里 ) 。 但是为了实现跨平台应用程序,开发者继续依赖远程脚本。这个问题,在 ASP.NET v2.0( Whidbey) 里已经得到根本的改变。
** Whidbey ** ** 对客户回调的支持 ** ** **
在 Whidbey 版本中,客户端可以调用服务器方法来提交数据,并且得到结果,而不用提交表单。这些调用你只要写很少的一些特别的代码,使用后台的 XML HTTP 来实现对服务器请求。
图一 显示应用程序逻辑流程。
你写了一个对服务器发出请求的客户端函数 ( 步骤 2) ,并且定义了一个服务器事件 ( 步骤 1 c) 处理这个请求。 ** CallBackManager ** 就像是一个中转站, 处理步骤 3 到步骤 6 的一系列过程。包括从客户端到服务器的请求的发出和数据从服务器到客户端的返回。
另一个客户端函数 ( 步骤 7) 处理服务器的返回信息。你写了两个客户端函数用来想服务器发出一个请求并且处理服务器的返回信息。
** 实现查询 **
假定你需要建立一个页面来实现从 3 张数据库表中查询数据: Region, Country, and City 。 ( 见图 2 )
这是一个 " dependent list " 问题的典型的例子。 当一个用户选择一个地区,则程序应当用在这个地区的国家来绑定 Country list 。 同样,当用户选择一个国家时, City list 应该为仅仅包含被选择的国家相应的城市。 ( 见图 2 )
当然可以使用正常 postback 技术来实现这写功能,但是你必须忍受每次向服务器发出请求而重绘整个页面的性能代价。然而,因为你能维护全部页布局代码,因此你可以提供一种更好、更快的方法来实现这个功能,这就是使用远程回调( ** remote callbacks ** ),每次只发送相应的标识并且仅仅得到那些相应的数据。
下载这篇文章 代码 ,代码包括 ** callback.sql ** 数据库脚本,用于建立本文 用那些数据。可以使用 SQL Server 或者 MSDE 数据库。 首先运行 数据库脚本 , ( 你可以根据需要更改,来使用其它数据库 ) 。然后启动 ** Visual Studio.NET Whidbey ** 建立例子 。 ** **
创造工程,选择模板类型 " ASP.NET Web Site "( 见 图 3 ) 。 这建立一个新页 default.aspx 。如果想也可以给它重新命名。
模板选择: 在 Visual Studio 里的模板选择对话中选择 ASP.NET 网站项目
在 default.aspx 页面 增加 dropdown controls 如 图 4 中所示。
你可以查看并且复制所有来自这篇文章 下载代码 用 _
1<asp:table> _ 包括的代码。
2
3为了实现远程回调这个功能,必须实现 ICallbackEventHandler 接口。 在页面增加以下的代码。
4
5
6 **< %@ implements interface=**
7
8
9 ** "System.Web.UI.ICallbackEventHandler" %>**
10
11** This interface has a single public event definition that you must implement: **
12
13
14 ** public string RaiseCallbackEvent(**
15
16
17 ** string eventArgument) { **
18
19
20 ** // Server side handling here...**
21
22
23 ** } **
24
25远程回调使客户端产生 ** _RaiseCallbackEvent_ ** . 因此,你应该处理并且返回基于客户端发出的 _eventArgument_ 相应的信息。 你可以从方法签名看见这种方法参数为一个 string 并且返回一个 string 。</asp:table>