The recent upsurge of asynchronous JavaScript and XML(AJAX) is entirely due to Google's use of Google Suggestions and Google Maps. Yes, ASP. On the net,
AJAX可以做服务器端处理,不需要回发,这样客户端(浏览器)就有了丰富的服务器端能力。换句话说,它为请求和服务器响应的异步分配和处理提供了一个框架。AJAX利用了一些不太新颖的现有技术。
但是最近对这些技术(加起来就是AJAX)的兴趣突然升温了。
请试试迈克尔施瓦茨的《阿贾克斯》。NET wrapper,通过它,ASP.NET开发人员可以快速方便地部署可以轻松利用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 wrapper将自动创建一个名为“Add”的JavaScript函数,它有两个参数。当使用JavaScript(在客户机上)调用这个函数时,请求将被传递给服务器,结果将返回给客户机。
初始设置
我们首先介绍“安装”的步骤。项目中使用的dll。如果您知道如何添加. dll文件引用,可以跳过这一节。
首先,如果您还没有,请下载最新的AJAX版本。解压缩下载的文件,并将ajax.dll放在项目的参考文件夹中。
在Visual Studio.NET中组织解决方案资源管理器的“引用”节点,并选择“添加引用”。在打开的对话框中,
单击浏览并找到ref/ajax.dll文件。单击打开,然后单击确定。所以你可以用AJAX编程。网包装纸。
建立HttpHandler
为了保证正常工作,第一步是在web.config中设置包装器的HttpHandler,不需要详细解释什么是HttpHandler,如何工作,只需要知道它们是用来处理ASP.NET请求的。举个例子,
所有*。aspx页面请求由系统处理。web.ui.pagehandlerfactory类。同样的,
我们允许所有对ajax/*的请求。ashx由Ajax处理。PageHandlerFactory:
《配置系统。web \httphandlers \u add verb=' POST,GET' path='ajax/* .阿贾克斯.PageHandlerFactory,Ajax '//httpHandlers
〈system.web〈/configuration
简而言之,上面的代码告诉ASP.NET任何匹配指定路径(ajax/*)的请求。ashx)将由Ajax处理。PageHandlerFactory,而不是默认的处理程序工厂。您不需要创建ajax子目录,
这个神秘的目录只是用来让其他HttpHandlers使用的。ashx扩展放在它们自己的子目录中。
创建页面
现在我们可以开始编码了。创建新页面或打开现有页面。在文件后的代码中,为Page_Load事件添加以下代码:
public class Index : System.Web.UI.Page{private void Page_Load(object sender, EventArgs e){Ajax.Utility.RegisterTypeForAjax(typeof(Index)); //}//}
调用RegisterTypeForAjax将触发页面上的以下JavaScript(或者手动将以下两行代码添加到页面中):
〈脚本语言=' JavaScript ' src=' Ajax/common。ashx '/script \脚本语言=' JavaScript ' src=' Ajax/Namespace .PageClass,程序集名称。ashx '/script
最后一行的意思是:
命名空间。当前页面的命名空间和类(通常是@Page指令中Inherits属性的值)。
AssemblyName——当前页面所属的程序集的名称(通常是项目名称)以下是AjaxPlay项目中sample.aspx页面的结果示例:
“%@ Page Inherits='AjaxPlay .示例“代码隐藏=”示例。aspx。cs“%〈html〉head〉script language=' JavaScript ' src=' Ajax/common。ashx '/script〈script language=' JavaScript ' src=' Ajax/Ajax play .样本,ajaxplay。ashx '/script/headbodyform id=' form 1 ' method=' post ' runat=' server '
﹨/form﹨/body﹨/html
可以在浏览器中手动导航到src路径(查看源代码,复制粘贴路径)检查是否一切正常。如果两条路径都输出一些(看似)无意义的文本,那就万事大吉了。如果没有输出或者出现ASP.NET错误,
说明有些地方存在问题。
即使你不知道HttpHandlers是如何工作的,上面的例子也很容易理解。通过web.config,我们确保了所有对ajax/*的请求。ashx由自定义处理程序处理。很明显,
这里的两个脚本标记将由一个自定义处理程序来处理。
创建一个服务器端函数
现在让我们创建一个可以从客户端调用异步访问的服务器端函数。因为目前不支持所有的返回类型(不用担心,会在当前版本的基础上开发新版本),所以我们还是继续使用简单的ServerSideAdd函数吧。在文件后的代码中,
将以下代码添加到页面中:
[Ajax.AjaxMethod()]public int ServerSideAdd(int firstNumber, int secondNumber){return firstNumber + secondNumber; }
注意这些函数有Ajax。AjaxMethod属性集。这个属性告诉包装器,这些方法创建要在客户机上调用的javaScript代理。
客户呼叫
最后一步是用JavaScript调用函数。AJAX包装器负责创建JavaScript函数示例。带有两个参数的ServerSideAdd。对于这个最简单的函数,只需调用这个方法并传递两个数字:
“%@ Page Inherits='AjaxPlay .示例“代码隐藏=”示例。aspx。cs“%〈html〉head〉script language=' JavaScript ' src=' Ajax/common。ashx '/script〈script language=' JavaScript ' src=' Ajax/Ajax play .样本,ajaxplay。ashx '/script/headbodyform id=' form 1 ' method=' post ' runat=' server 'script language=' JavaScript ' var response=sample .ServerSideAdd(100,99);警报(响应。值);﹨/script﹨/form﹨/body﹨/html
当然,我们并不想仅仅用这种强大的能力来警告用户。这就是为什么所有的客户端代理,如JavaScript示例。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——错误消息(如果有)。
对xml http请求的原始响应。
上下文——上下文对象。
首先,我们检查错误,看是否有错误。通过在服务器端函数中抛出异常,可以轻松处理错误特性。在这个简化的例子中,这个值然后被用来警告用户。请求特性可用于获取更多信息(参见下一节)。
处理类型
返回复杂类型
Ajax包装器不仅能处理ServerSideAdd函数所返回的整数。
它目前还支持integers、strings、double、booleans、DateTime、DataSets和DataTables,以及自定义类和数组等基本类型。
其他所有类型都返回它们的ToString值。返回的DataSets和真正的.NET DataSet差不多。假设一个服务器端函数返回DataSet,我们可以通过下面的代码在客户端显示其中的内容:
〈script language='JavaScript'//Asynchronous call to the mythical 'GetDataSet' server-side functionfunction getDataSet(){AjaxFunctions.GetDataSet(GetDataSet_callback); }function GetDataSet_callback(response){var ds=response.value; if(ds !=null typeof(ds)=='object' ds.Tables !=null){var s=new Array(); s[s.length]='〈table border=1'; for(var i=0; i〈ds.Tables[0].Rows.length; i++){s[s.length]='〈tr'; s[s.length]=qu