ASP.NET编程:使用ajax.dll举行asp.net ajax开辟
我有个同学,他是搞Java的,他给我说“Java不是效率低,而是速度慢。”,我不是搞Java的,我实在想不透这句话的含义,难道执行速度不就是效率低吗?难道执行速度慢还成效率高了?AsynchronousJavaScriptandXML(AJAX)比来掀起的低潮,要完整回功于Google在GoogleSuggest和GoogleMaps中的利用。对ASP.NET而言,AJAX不必要回传就可以举行服务器端处置,从而使客户机(扫瞄器)具有丰厚的服务器端才能。换句话说,它为异步指派和处置哀求与服务器呼应供应了一个框架。AJAX使用了一些不是很新奇的已有手艺,可是对这些手艺(加到一同就是AJAX)的喜好比来俄然升温。请实验MichaelSchwarz的AJAX.NET包装器,经由过程它ASP.NET开辟职员能够疾速便利的部署很简单使用AJAX功效的页面。必要注重的是,这个包装器处于早期开辟阶段,因而还没有完整成熟。
它是怎样事情的——概述
AJAX依托代办署理(broker)指派和处置往复服务器的哀求。对此,.NET包装器依托客户端XmlHttpRequest工具。多半扫瞄器都撑持XmlHttpRequest工具,这就是选择它的缘故原由。由于包装器的目标是埋没XmlHttpRequest的完成,我们就不再具体会商它了。
包装器自己经由过程将.NET函数标志为AJAX办法来事情。标志以后,AJAX就创立对应的JavaScript函数,这些函数(和任何JavaScript函数一样)作为代办署理能够在客户端利用XmlHttpRequest挪用。这些代办署理再映照回服务器端函数。
庞大吗?其实不庞大。我们来看一个例子。假定有一个.NET函数:
ublicintAdd(intfirstNumber,intsecondNumber)
{
returnfirstNumber+secondNumber;
}
AJAX.NET包装器将主动创立名为“Add”、带有两个参数的JavaScript函数。利用JavaScript(在客户机上)挪用该函数时,哀求将传送给服务器并把了局前往给客户机。
初始设置
我们起首先容“安装”项目中利用的.dll的步骤。假如您很分明怎样增加.dll文件援用,能够跳过这一节。
起首,假如还没有的话,请下载最新的AJAX版本。解压下载的文件并把ajax.dll放到项目标援用文件夹中。在VisualStudio.NET中无机SolutionExplorer的“References(援用)”节点并选择AddReference(增加援用)。在翻开的对话框中,单击Browse(扫瞄)并找到ref/ajax.dll文件。顺次单击Open(翻开)和Ok(确认)。如许就能够用AJAX.NET包装器编程了。
创建HttpHandler
为了包管一般事情,第一步是在web.config中设置包装器的HttpHandler。不必要具体注释HttpHandlers是甚么及其怎样事情,只需晓得它们用于处置ASP.NET哀求就充足了。好比,一切*.aspx页面哀求都由
System.Web.UI.PageHandlerFactory类处置。相似的,我们让一切对ajax/*.ashx的哀求由Ajax.PageHandlerFactory处置:
〈configuration>
〈system.web>
〈httpHandlers>
〈addverb="POST,GET"path="ajax/*.ashx"
type="Ajax.PageHandlerFactory,Ajax"/>
〈/httpHandlers>
〈system.web>
〈/configuration>
简言之,下面的代码告知ASP.NET,和指定路径(ajax/*.ashx)婚配的任何哀求都由Ajax.PageHandlerFactory而不是默许处置程序工场来处置。不必要创立ajax子目次,利用这个奥秘的目次只是为了让其他HttpHandlers可以在本人创建的子目次中利用.ashx扩大。
创建页面
如今我们能够入手下手编码了。创立一个新页面大概翻开已有的页面,在file后的代码中,为Page_Load事务增加以下代码:
publicclassIndex:System.Web.UI.Page{
privatevoidPage_Load(objectsender,EventArgse){
Ajax.Utility.RegisterTypeForAjax(typeof(Index));
//
}
//
}
挪用RegisterTypeForAjax将在页面上激发前面的JavaScript(大概在页面中手工到场以下两行代码):
〈scriptlanguage="javascript"src="ajax/common.ashx">〈/script>
〈scriptlanguage="javascript"
src="ajax/Namespace.PageClass,AssemblyName.ashx">〈/script>
个中最初一行的寄义是:
Namespace.PageClass——以后页面的称号空间和类(一般是@Page指令中Inherits属性的值)
AssemblyName——以后页面所属程序集的称号(一般就是项目名)
上面是AjaxPlay项目中sample.aspx页面的了局例子:
〈%@PageInherits="AjaxPlay.Sample"Codebehind="sample.aspx.cs"%>
〈html>
〈head>
〈scriptlanguage="javascript"src="ajax/common.ashx">〈/script>
〈scriptlanguage="javascript"
src="ajax/AjaxPlay.Sample,AjaxPlay.ashx">〈/script>
〈/head>
〈body>
〈formid="Form1"method="post"runat="server">
〈/form>
〈/body>
〈/html>
能够在扫瞄器中手工导航到src路径(检察源代码,复制粘贴路径)反省是不是统统一般。假如两个路径都输入一些(仿佛)毫偶然义的文本,就高枕无忧了。假如甚么也没输入大概呈现ASP.NET毛病,则标明有些中央呈现成绩。
即使不晓得HttpHandlers怎样事情,下面的例子也很简单了解。经由过程web.config,我们已包管一切对ajax/*.ashx的哀求都由自界说的处置程序处置。明显,这里的两个剧本标签将由自界说的处置程序处置。
创立服务器端函数
如今来创立可从客户端挪用中异步会见的服务器端函数。由于今朝还不撑持一切的前往范例(不必忧虑,将在今朝的基本上开辟新的版本),我们持续利用复杂的ServerSideAdd函数吧。在file后的代码中,向页面增加以下代码:
publicintServerSideAdd(intfirstNumber,intsecondNumber)
{
returnfirstNumber+secondNumber;
}
要注重,这些函数具有Ajax.AjaxMethod属性集。该属性告知包装器这些办法创立javaScript代办署理,以便在客户端挪用。
客户端挪用
最初一步是用JavaScript挪用该函数。AJAX包装器卖力创立带有两个参数的JavaScript函数Sample.ServerSideAdd。对这类最复杂的函数,只必要挪用该办法并传送两个数字:
〈%@PageInherits="AjaxPlay.Sample"Codebehind="sample.aspx.cs"%>
〈html>
〈head>
〈scriptlanguage="javascript"src="ajax/common.ashx">〈/script>
〈scriptlanguage="javascript"
src="ajax/AjaxPlay.Sample,AjaxPlay.ashx">〈/script>
〈/head>
〈body>
〈formid="Form1"method="post"runat="server">
〈scriptlanguage="javascript">
varresponse=Sample.ServerSideAdd(100,99);
alert(response.value);
〈/script>
〈/form>
〈/body>
〈/html>
固然,我们不但愿仅仅用这类壮大的才能来告诫用户。这就是一切客户端代办署理(如JavaScriptSample.ServerSideAd函数)还承受其他特征的缘故原由。这类特征就是为了处置呼应而挪用的回调函数:
Sample.ServerSideAdd(100,99,ServerSideAdd_CallBack);
functionServerSideAdd_CallBack(response){
if(response.error!=null){
alert(response.error);
return;
}
alert(response.value);
}
从上述代码中能够看到我们指定了别的一个参数。ServerSideAdd_CallBack(一样拜见上述代码)是用于处置服务器呼应的客户端函数。这个回调函数吸收一个呼应工具,该工具公然了三个次要性子
Value——服务器端函数实践前往的值(不管是字符串、自界说工具仍是数据集)。
Error——毛病动静,假如有的话。
Request——xmlhttp哀求的原始呼应。
Context——高低文工具。
起首我们反省error只看看是不是呈现了毛病。经由过程在服务器端函数中抛出非常,能够很简单处置error特征。在这个简化的例子中,然后用这个值告诫用户。Request特征可用于取得更多信息(拜见下一节)。
处置范例
前往庞大范例
Ajax包装器不但能处置ServerSideAdd函数所前往的整数。它今朝还撑持integers、strings、double、booleans、DateTime、DataSets和DataTables,和自界说类和数组等基础范例。其他一切范例都前往它们的ToString值。
前往的DataSets和真实的.NETDataSet差未几。假定一个服务器端函数前往DataSet,我们能够经由过程上面的代码在客户端显现个中的内容:
〈scriptlanguage="JavaScript">
//Asynchronouscalltothemythical"GetDataSet"server-sidefunction
functiongetDataSet(){
AjaxFunctions.GetDataSet(GetDataSet_callback);
}
functionGetDataSet_callback(response){
vards=response.value;
if(ds!=null&&typeof(ds)=="object"&&ds.Tables!=null){
vars=newArray();
s="〈tableborder=1>";
for(vari=0;i〈ds.Tables.Rows.length;i++){
s="〈tr>";
s="〈td>"+ds.Tables.Rows.FirstName+"〈/td>";
s="〈td>"+ds.Tables.Rows.Birthday+"〈/td>";
s="〈/tr>";
}
s="〈/table>";
tableDisplay.innerHTML=s.join("");
}
else{
alert("Error."+response.request.responseText);
}
}
〈/script>
Ajax还能够前往自界说类,独一的请求是必需用Serializable属性标志。假定有以下的类:
publicclassUser{
privateint_userId;
privatestring_firstName;
privatestring_lastName;
publicintuserId{
get{return_userId;}
}
publicstringFirstName{
get{return_firstName;}
}
publicstringLastName{
get{return_lastName;}
}
publicUser(int_userId,string_firstName,string_lastName){
this._userId=_userId;
this._firstName=_firstName;
this._lastName=_lastName;
}
publicUser(){}
publicstaticUserGetUser(intuserId){
//ReplacethiswithaDBhitorsomething:)
returnnewUser(userId,"Michael","Schwarz");
}
}
我们能够经由过程挪用RegisterTypeForAjax注册GetUser代办署理:
privatevoidPage_Load(objectsender,EventArgse){
Utility.RegisterTypeForAjax(typeof(User));
}
如许就能够在客户端异步伐用GetUser:
〈scriptlanguage="javascript">
functiongetUser(userId){
User.GetUser(GetUser_callback);
}
functionGetUser_callback(response){
if(response!=null&&response.value!=null){
varuser=response.value;
if(typeof(user)=="object"){
alert(user.FirstName+""+user.LastName);
}
}
}
getUser(1);
〈/script>
呼应中前往的值实践上是一个工具,公然了和服务器端工具不异的属性(FirstName、LastName和UserId)。
自界说转换器
我们已看到,Ajax.NET包装器可以处置良多分歧的.NET范例。可是除大批.NET类和内建范例之外,包装器对不克不及准确前往的其他范例仅仅挪用ToString()。为了不这类情形,Ajax.NET包装器同意开辟职员创立工具转换器,用于在服务器和客户机之间光滑传送庞大工具。
其他事项
在其他类中注册函数
下面的例子中,我们的服务器端函数都放在实行页面面前的代码中。可是,没有来由不克不及把这些函数放在独自的类文件中。要记着,包装器的事情体例是在指定类中发明一切带Ajax.AjaxMethod的办法。必要的类经由过程第二个剧本标签指定。利用Ajax.Utility.RegisterTypeForAjax,我们能够指定必要的任何类。好比,将我们的服务器端函数作为独自的类是通情达理的:
PublicClassAjaxFunctions
〈Ajax.AjaxMethod()>_
PublicFunctionValidate(usernameAsString,passwordAsString)AsBoolean
dosomething
Returnsomething
EndFunction
EndClass
经由过程指定类的范例而不是页面就能够让Ajax包装器创立代办署理:
privatevoidPage_Load(objectsender,EventArgse){
Ajax.Utility.RegisterTypeForAjax(typeof(AjaxFunctions));
//
}
要记着,客户端代办署理的称号是〈ClassName>.〈ServerSideFunctionName>。因而,假如ServerSideAdd函数放在下面假造的AjaxFunctions类中,客户端挪用就应当是:AjaxFunctions.ServerSideAdd(1,2)。
代办署理究竟是怎样事情的
Ajax工具天生的第二个剧本标签(也能够手工拔出)传送了页面的称号空间、类名和程序集。依据这些信息,Ajax.PageHandlerFactory就可以够利用反射失掉具有特定属性的任何函数的具体信息。明显,处置函数查找具有AjaxMethod属性的函数并失掉它们的署名(前往范例、称号和参数),从可以创立需要的客户端代办署理。详细而言,包装器创立一个和类同名的JavaScript工具,该工具供应代办署理。换句话说,给定一个带有AjaxServerSideAdd办法的服务器端类AjaxFunctions,我们就会失掉公然ServerSideAdd函数的AjaxFunctionJavaScript工具。假如将扫瞄器指向第二个剧本标签的路径就会看到这类举措。
前往Unicode字符
Ajax.NET包装器可以从服务器向客户机前往Unicode字符。为此,数据在前往之前必需在服务器上用html编码。好比:
publicstringTest1(stringname,stringemail,stringcomment){
stringhtml="";
html+="Hello"+name+"〈br>";
html+="Thankyouforyourcomment〈b>";
html+=System.Web.HttpUtility.HtmlEncode(comment);
html+="〈/b>.";
returnhtml;
}
SessionState
服务器端函数中极可能必要会见会话信息。为此,只必要经由过程传送给Ajax.AjaxMethod属性的一个参数告知Ajax启用这类功效。
在考查包装器会话才能的同时,我们来看看其他几个特征。这个例子中我们有一个文档办理体系,用户编纂的时分会对文档加锁。其他用户能够哀求在文档可用的时分失掉关照。假如没有AJAX,我们就只能守候该用户再次前往来反省哀求的文档是不是可用。明显不敷幻想。利用撑持会话形态的Ajax就十分复杂了。
起首来编写服务器端函数,方针是轮回遍历用户但愿编纂的documentId(保留在会话中)并前往一切已开释的文档。
publicArrayListDocumentReleased(){
if(HttpContext.Current.Session["DocumentsWaiting"]==null){
returnnull;
}
ArrayListreadyDocuments=newArrayList();
int[]documents=(int[])HttpContext.Current.Session["DocumentsWaiting"];
for(inti=0;i〈documents.Length;++i){
Documentdocument=Document.GetDocumentById(documents);
if(document!=null&&document.Status==DocumentStatus.Ready){
readyDocuments.Add(document);
}
}
returnreadyDocuments;
}
}
要注重,我们指定了HttpSessionStateRequirement.Read值(还能够用Write和ReadWrite)。
如今编写利用该办法的JavaScript:
〈scriptlanguage="javascript">
functionDocumentsReady_CallBack(response){
if(response.error!=null){
alert(response.error);
return;
}
if(response.value!=null&&response.value.length>0){
vardiv=document.getElementById("status");
div.innerHTML="Thefollowingdocumentsareready!〈br/>";
for(vari=0;i〈response.value.length;++i){
div.innerHTML+="〈ahref="edit.aspx?documentId="+response.value.DocumentId+"">"+response.value.Name+"〈/a>〈br/>";
}
}
setTimeout(page.DocumentReleased(DocumentsReady_CallBack),10000);
}
〈/script>
〈bodyonload="setTimeout(Document.DocumentReleased(DocumentsReady_CallBack),10000);">
停止语
AJAX手艺已催生了本来只要桌面开辟才具有的强健而丰厚的Web界面。Ajax.NET包装器让您很简单就可以使用这类新的壮大手艺。请注重,Ajax.NET包装器和文档仍在开辟当中。
无论谁倒了对双方阵营的粉丝们也是有害无益。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。 在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗? 是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
页:
[1]