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

ASP.NET 2.0 客户端无刷新调用服务器端方法获取数据

2008-06-21 12:24 736 查看
制约B/S程序的一个重要原因可能归结於Http协议的无状态性,每当我们要客户端从服务器上获取数据或想执行一段服务器端代码,我们必须先提交页面,在页面提交后,事件句柄使代码执行并把结果返回给提交的客户端,这个事件驱动模式在大部分情况下没有问题,但是它却强制ASP.NET开发者必须多做一些事情。为了保存窗体上的控件状态,开发人员要么使用大量降低页面速度的ViewState,要么得写一些复杂的程序逻辑,而且这也使浏览器增加了处理时间。在小页面上,这没什么问题,但是在一些大量DHTML应用的页面,或内容很多的页面上,宽带用户就会感觉到“闪”,而拨号用户甚至会看见状态栏中蓝色的进度条。所以,如果能在客户端调用服务器端代码将是一件美好的事情,而ASP.NET 2.0 使其成为现实。ASP.NET 2.0有一个受关注的焦点是客户端回访功能,也就是说在页面上用客户端的Javascript代码调用服务器端代码而不需要页面回传。在过去,TreeView控件的频繁刷新页面已经让我们无法忍受,但是现在因为有了Client Callback,我们可以告别这一现象了。

在了解回访技术前,我们来看看现在通常程序员是怎么做的。由javascript访问服务器端代码通常求助于微软的XMLHTTP ActiveX组件。这个组件允许你通过http协议通过互联网获取xml文档,然而并不像和它的名字所表示的那样,其实你可以用这个组件来对任何服务器发送http请求,包括老式的asp,标准html,甚至php文件,而仅仅收回一个未处理的html输出。因为这个组件几乎是一个标准的ActiveX组件,你可以用标准的javascript语法来实例化它:
function RetrieveGoogleFrontPage()
{
var XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");
XmlHttp.Open("GET", "http://www.google.com", false);
XmlHttp.Send();
return XmlHttp.responseText;
}
我们看到代码非常的简单,而所有代码都是javascript中执行,不需要重新提交页面,也就不会再闪了,但是请注意到,这个组件获取的是整个页面,所以如果你需要的仅仅是一部分数据,你需要单独写一个页面来返回你需要的数据。

我们来看看ASP.NET 2.0中的Client Callback,其实在底层同样是使用了XmlHttp技术,只不过封装起来,对
程序员屏蔽了。Client Callback由2部分组成:新的ICallbackEventHandler接口和Page类新的静态方法
GetCallbackEventReference()。Page.GetCallbackEventReference()方法及其重载生成了客户端所需要的javascript代码段,这些代码在底层使用了XmlHttp组件发出了一个http请求,而服务器端通过一个实现了ICallbackEventHandler接口的控件接受它,通常这个控件就是页面自己本身,但是你也可以明确地用你自己的用户控件或web控件对这个请求进行响应。当请求返回时,结果是通过另外一个javascript函数来接受的。我们来看一个从服务器获取系统时间并在客户端alert出来的代码:
<%@ page language="C#" compilewith="ServerTime.aspx.cs" classname="ASP.ServerTime_aspx"%>
<html>
<head>
<title>Server Time</title>
<script language="javascript">
function GetServerTime()
{
var message = '';
var context = '';
<%=sCallBackFunctionInvocation%>
}
function ShowServerTime(timeMessage, context)
{
alert('The time on the server is:/n' + timeMessage);
}
function OnError(message, context)
{
alert('An unhandled exception has occurred:/n' + message);
}
</script>
</head>
<body>
<form id="MainForm" runat="server">
<input type="button" value="Get Server Time" onclick="GetServerTime();" /> </form>
</body>
</html>
using System;
using System.Web.UI;
namespace ASP
{
public partial class ServerTime_aspx : ICallbackEventHandler
{ public string sCallBackFunctionInvocation;
void Page_Load(object sender,System.EventArgs e)
{
sCallBackFunctionInvocation =this.GetCallbackEventReference(this,"message","ShowServerTime","context","OnError");
}
public string RaiseCallbackEvent(string eventArgument)
{
return DateTime.Now.ToString();
}
}
}
这里注意到页面实现了ICallbackEventHandler接口,这个接口只有一个方法RaiseCallbackEvent,这个方法就是页面接受到一个回调请求时所执行的代码在这个例子中,简单地返回一个系统时间。为了产生客户端调用代码,我们在Page_Load中调用了 Page.GetCallbackEventReference方法,这个方法有很多重载,但都包含了以下参数:即将接受请求的控件(在这里是当前页),包含参数值的客户端变量名,以及请求返回或出错时要执行的客户端函数。返回值是生成的javascript代码,在页面上的<%=sCallBackFunctionInvocation%>在页面执行时将被替换为:
__doCallback('__Page',message,ShowServerTime,context,OnError)
__doCallback是ASP.NET 2.0的一个公共方法,用于向服务器回发请求。



从上图中可以看出这种调用的过程。

注意:本文内容来自《ASP.NET 2.0's Client Callback Feature》(英文)一文,原文来自网络,作者未知,翻译时有删节并对一些段落加入解释与调整。

Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1041695
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐