gengen


======================================================
注:本文源代码点此下载
======================================================

新闻频道 -> 正文

-->

asynchronous javascript and xml(ajax)最近掀起的高潮,要完全归功于google在google suggestgoogle maps中的使用。对asp.net而言,ajax不需要回传就能进行服务器端处理,从而使客户机(浏览器)具有丰富的服务器端能力。换句话说,它为异步指派和处理请求与服务器响应提供了一个框架。ajax利用了一些不是很新颖的已有技术,但是对这些技术(加到一起就是ajax)的爱好最近突然升温。

请尝试michael schwarz的ajax .net包装器,通过它asp.net开发人员可以快速方便的部署很容易利用ajax功能的页面。需要注意的是,这个包装器处于初期开发阶段,因此还没有完全成熟。

然而,ajax这样的技术很可能破坏分层体系结构(n-tier)。我的看法是,ajax增加了表示逻辑层(甚至更糟,业务层)渗透到表示层的可能性。像我这样严肃的架构师对这种想法可能畏步不前。我感到ajax的使用即便稍微越过了层次边界,这种代价也是值得深思的。当然,这要视具体的项目和环境而定。

起步

它是如何工作的——概述

ajax依靠代理(broker)指派和处理往返服务器的请求。对此,.net包装器依靠客户端xmlhttprequest对象。多数浏览器都支持xmlhttprequest对象,这就是选择它的原因。因为包装器的目的是隐藏xmlhttprequest的实现,我们就不再详细讨论它了。

包装器本身通过将.net函数标记为ajax方法来工作。标记之后,ajax就创建对应的javascript函数,这些函数(和任何javascript函数一样)作为代理可以在客户端使用xmlhttprequest调用。这些代理再映射回服务器端函数。

复杂吗?并不复杂。我们来看一个例子。假设有一个.net函数:

ublic int add(int firstnumber, int secondnumber)

{

return firstnumber + secondnumber;

}

ajax .net包装器将自动创建名为“add”、带有两个参数的javascript函数。使用javascript(在客户机上)调用该函数时,请求将传递给服务器并把结果返回给客户机。

初始设置

我们首先介绍“安装”项目中使用的.dll的步骤。如果您很清楚如何添加.dll文件引用,可以跳过这一节。

首先,如果还没有的话,请下载最新的ajax版本。解压下载的文件并把ajax.dll放到项目的引用文件夹中。在visual studio.net中有机solution explorer的“references(引用)”节点并选择add reference(添加引用)。在打开的对话框中,单击browse(浏览)并找到ref/ajax.dll文件。依次单击open(打开)和ok(确认)。这样就可以用ajax .net包装器编程了。

建立httphandler

为了保证正常工作,第一步是在web.config中设置包装器的httphandler。不需要详细解释httphandlers是什么及其如何工作,只要知道它们用于处理asp.net请求就足够了。比如,所有*.aspx页面请求都由system.web.ui.pagehandlerfactory类处理。类似的,我们让所有对ajax/*.ashx的请求由ajax.pagehandlerfactory处理:

通常是@page指令中inherits属性的值)

assemblyname——当前页面所属程序集的名称(通常就是项目名)

下面是ajaxplay项目中sample.aspx页面的结果例子:

当然,我们不希望仅仅用这种强大的能力来警告用户。这就是所有客户端代理(如javascript sample.serversidead函数)还接受其他特性的原因。这种特性就是为了处理响应而调用的回调函数:

sample.serversideadd(100,99, serversideadd_callback);

function serversideadd_callback(response){

if (response.error != null){

alert(response.error);

return;

}

alert(response.value);

}

从上述代码中可以看到我们指定了另外一个参数。serversideadd_callback(同样参见上述代码)是用于处理服务器响应的客户端函数。这个回调函数接收一个响应对象,该对象公开了三个主要性质

value——服务器端函数实际返回的值(无论是字符串、自定义对象还是数据集)。

error——错误消息,如果有的话。

request——xml http请求的原始响应。

context——上下文对象。

首先我们检查error只看看是否出现了错误。通过在服务器端函数中抛出异常,可以很容易处理error特性。在这个简化的例子中,然后用这个值警告用户。request特性可用于获得更多信息(参见下一节)。

处理类型

返回复杂类型

ajax包装器不仅能处理serversideadd函数所返回的整数。它目前还支持integers、strings、double、booleans、datetime、datasets和datatables,以及自定义类和数组等基本类型。其他所有类型都返回它们的tostring值。

返回的datasets和真正的.net dataset差不多。假设一个服务器端函数返回dataset,我们可以通过下面的代码在客户端显示其中的内容:

ajax还可以返回自定义类,唯一的要求是必须用serializable属性标记。假设有如下的类:

[serializable()]

public class user{

private int _userid;

private string _firstname;

private string _lastname;

public int userid{

get { return _userid; }

}

public string firstname{

get { return _firstname; }

}

public string lastname{

get { return _lastname; }

}

public user(int _userid, string _firstname, string _lastname){

this._userid = _userid;

this._firstname = _firstname;

this._lastname = _lastname;

}

public user(){}

[ajaxmethod()]

public static user getuser(int userid){

//replace this with a db hit or something :)

return new user(userid,"michael", "schwarz");

}

}

我们可以通过调用registertypeforajax注册getuser代理:

private void page_load(object sender, eventargs e){

utility.registertypeforajax(typeof(user));

}

这样就可以在客户端异步调用getuser:

响应中返回的值实际上是一个对象,公开了和服务器端对象相同的属性(firstname、lastname和userid)。

自定义转换器

我们已经看到,ajax .net包装器能够处理很多不同的.net类型。但是除了大量.net类和内建类型以外,包装器对不能正确返回的其他类型仅仅调用tostring()。为了避免这种情况,ajax .net包装器允许开发人员创建对象转换器,用于在服务器和客户机之间平滑传递复杂对象。

其他事项

在其他类中注册函数

上面的例子中,我们的服务器端函数都放在执行页面背后的代码中。但是,没有理由不能把这些函数放在单独的类文件中。要记住,包装器的工作方式是在指定类中发现所有带ajax.ajaxmethod的方法。需要的类通过第二个脚本标签指定。使用ajax.utility.registertypeforajax,我们可以指定需要的任何类。比如,将我们的服务器端函数作为单独的类是合情合理的:

public class ajaxfunctions

好文要顶关注我收藏该文与我联系


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值