综述ASP.NET下的AJAX模式

 本文内容:

一、导言
二、XMLHttp+WebForm模式

三、XMLHttp+HttpHandler模式

四、ASP.NET 2.0/3.5回调模式

五、AJAX框架模式
--------------------------------------------------------------------------------------------------

一、导言
     在这篇文章中,将介绍在ASP.NET环节下的几种常用的AJAX模式。例如:XMLHttpRequest+WebForms,XMLHttpRequest+HttpHandlers,CallBacks,以及使用AJAX框架等,下面将以示例结合的方式展开介绍这一系列常用模式。本文之后将提供示例代码下载。

二、XMLHttp+WebForm模式

     或许大家都比较清楚的记得,XMLHttp+WebForm模式是ASP.NET下最原始的AJAX模式。在这种模式下,是通过JavaScript去操作XMLHttpRequest对象,发送异步请求到服务器端的WEB窗体的形式。另一方面,在服务端创建WEB窗体可以直接用来接受XMLHTTP的请求。以此,浏览器的XMLHttpRequest对象便成了服务器端和客户端的一种良好的沟通方式。

     在这一节将结合一个简单的示例来介绍,希望能够帮助大家更直观的理解XMLHttp+WebForm模式的这种AJAX模式。

     (1)、客户端

          客户端里创建XMLHttpRequest对象以及发起异步请求我们将其JavaScript封装在一个Ajax.js文件里。这样部分方法可以达到重用,在Ajax.js里有三个方法,newXmlHttpReqeust,sendRequest和onSuccessCallBack方法,详细如下:

 1//创建XMLHttpRequest对象
 2var xmlHttp;
 3ExpandedBlockStart.gifContractedBlock.giffunction newXMLHttpRequest() {
 4
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    if (window.XMLHttpRequest) {
 6        xmlHttp = new XMLHttpRequest();
 7ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else if (window.ActiveXObject) {
 8ExpandedSubBlockStart.gifContractedSubBlock.gif        try 
 9            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
10ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 catch (e1) 
11ExpandedSubBlockStart.gifContractedSubBlock.gif            try {
12                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
13ExpandedSubBlockStart.gifContractedSubBlock.gif            }
 catch (e2) {
14            }
 
15        }

16     }

17       return xmlHttp;
18}
 
19
20//发起异步请求
21ExpandedBlockStart.gifContractedBlock.giffunction sendRequest(){
22    newXMLHttpRequest();
23    var url="AjaxForm.aspx?name="+document.getElementById("txtName").value;
24      xmlHttp.open("GET",url,true);
25    xmlHttp.onreadystatechange=onSuccessCallBack;
26    xmlHttp.send(null);
27}

28
29//回调处理函数
30ExpandedBlockStart.gifContractedBlock.giffunction onSuccessCallBack(){
31    if (xmlHttp.readyState == 4
32ExpandedSubBlockStart.gifContractedSubBlock.gif    {
33        if (xmlHttp.status == 200
34ExpandedSubBlockStart.gifContractedSubBlock.gif        {
35            document.getElementById("result").innerHTML = xmlHttp.responseText;
36        }
 
37        else 
38ExpandedSubBlockStart.gifContractedSubBlock.gif        {
39            document.getElementById("result").innerHTML=result.status;
40        }

41    }

42}


     客户端调用异步发起请求前首先执行创建XmlHttpRequest对象的方法,最后通过回调函数更新页面显示。
     (2)、服务端

          服务端就是一个WebForm,接受客户端传递的参数然后将其转化为大写后返回给客户端。

 1protected void Page_Load(object sender, EventArgs e)
 2ExpandedBlockStart.gifContractedBlock.gif{
 3    if (!IsPostBack)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 5        string name = Request.QueryString["name"];
 6        Response.Write(name.ToUpper());
 7        Response.Flush();
 8        Response.End();
 9    }

10}

 

三、XMLHttp+HttpHandler模式

     此模式和上一种形式上没有太大的差别,只是服务端的处理对象不同,一个是WebForm一个则是HttpHandler。在HttpHandler里通过Request对象获取请求的参数,然后通过Response对象将结果返回,是直接通过HttpHandler的ProcessRequest方法来处理的。OK,既然是这样,那么我们只需要在上一模式的基础上将请求Url修改为HttpHandler就OK了,如下:

 1public class AjaxHandler : IHttpHandler
 2ExpandedBlockStart.gifContractedBlock.gif{
 3
 4    public void ProcessRequest(HttpContext context)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 6        context.Response.ContentType = "text/plain";
 7        string name = context.Request.QueryString["name"];
 8        context.Response.Write(name.ToUpper());
 9    }

10
11    public bool IsReusable
12ExpandedSubBlockStart.gifContractedSubBlock.gif    {
13        get
14ExpandedSubBlockStart.gifContractedSubBlock.gif        {
15            return false;
16        }

17    }

18}

 

四、ASP.NET 2.0/3.5回调模式

     ASP.NET的回调,其实很好理解,就是使用ICallbackEventHandler接口,通过实现RaiseCallbackEvent()和GetCallbackResult()方法来实现回调,最后通过调用ClientScript.GetCallbackEventReference()方法实现Ajax效果。看看下面这个示例:

 1namespace AjaxPattern._3
 2ExpandedBlockStart.gifContractedBlock.gif{
 3    public partial class AjaxForm : System.Web.UI.Page,ICallbackEventHandler
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 5        protected void Page_Load(object sender, EventArgs e)
 6ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 7
 8        }

 9
10        string text = string.Empty;
11
12        public string GetCallbackResult()
13ExpandedSubBlockStart.gifContractedSubBlock.gif        {
14            return text;
15        }

16
17        public void RaiseCallbackEvent(string eventArgument)
18ExpandedSubBlockStart.gifContractedSubBlock.gif        {
19            text = DateTime.Now.ToLocalTime().ToString();
20        }

21    }

22}


      上 面便是实现了ICallbackEventHandler,在RaiseCallbackEvent方法里将当前时间返回,客户端通过调用 ClientScript.GetCallbackEventReference()方法,来实现Ajax,客户端代码如下:

 1<script type="text/javascript">
 2function receiveServerData(arg,context)
 3ExpandedBlockStart.gifContractedBlock.gif{
 4    document.getElementById("result").innerHTML=arg;
 5}

 6
 7function callServer(arg,context)
 8ExpandedBlockStart.gifContractedBlock.gif{
 9    <%=ClientScript.GetCallbackEventReference(this,"arg","receiveServerData","context"%>;
10}

11</script>

     

     现在我们就可以通过调用callServer方法去回调服务端的方法了,html如下:

1 <input type="button" value="Submit" onclick="callServer()" />
2 <hr />
3 <div id="result">
4 
5 </div>

     以上三种模式相比成型的AJAX框架来说使用起比较麻烦,没有框架那么直接,通过调用一个请求方法就搞定AJAX请求。不过各自也有各自的好处,在我们的实际开发中应该根据实际需求来选择适合自己的AJAX模式。  

五、AJAX框架模式

     此模式,顾名思义就是使用成型的AJAX框架来开发AJAX应用。如:JQuery,ASP.NET AJAX等等。具体的使用我在这里就不在做重复的示例和介绍了,有兴趣的朋友可以看看我写的其他有关AJAX框架的文章。

     相关文章:JavaScript与Web Service组合实现无刷新交互   ----使用ASP.NET AJAX
                   ASP.NET MVC中使用AJAX(XMLHttpRequest、Microsoft AJAX Library......)  ----包括JQuery

参考文献:http://aspalliance.com/1740_Summarizing_AJAX_Patterns_Under_ASPNET

示例下载:点击下载示例代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JIRA-6.3.6安装与破解

首先下载JIRA-6.3.6的安装包&#xff1a; wget http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-6.3.6.tar.gz 在这里笔者新建JIRA用户来专门运行JIRA useradd jira passwd jira 把包解压到jira的宿主目录(/home/jira)下&#xff1a; tar -zxvf atla…

求二进制数中1的个数

要求&#xff1a;对于一个字节&#xff08;8bit&#xff09;的变量&#xff0c;求其二进制表示中“1”的个数&#xff0c;要求算法的执行效率尽可能地高。 大多数的读者都会有这样的反应&#xff1a;这个题目也太简单了吧&#xff0c;解法似乎也相当地单一&#xff0c;不会有太…

面试题 锁消除是什么

锁消除是在编译器级别的事情。 在即时编译器时&#xff0c;如果发现不可能被共享的对象&#xff0c;则可以消除这些对象的锁操作。 也许你会觉得奇怪&#xff0c;既然有些对象不可能被多线程访问&#xff0c;那为什么要加锁呢&#xff1f;写代码时直接不加锁不就好了。 但是…

面试题-- 什么是偏向锁

所谓的偏向&#xff0c;就是偏心&#xff0c;即锁会偏向于当前已经占有锁的线程 。 大部分情况是没有竞争的&#xff08;某个同步块大多数情况都不会出现多线程同时竞争锁&#xff09;&#xff0c;所以可以通过偏向来提高性能。即在无竞争时&#xff0c;之前获得锁的线程再次获…

Collections.min()和Collections.max()的使用

取集合中的最小值 Collections.min(); 取集合中的最大值 Collections.max(); public class TestCollectionMinMax {public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(3);list.add(7);list.add(9);list.add(1);list.add(…

python学习之路(九)

这一节主要讲的是装饰器。装饰器是一个非常好用的&#xff0c;用于装饰已有函数的函数功能。 其优点是不用修改调用方式&#xff0c;还不用修改源代码。 他的思想是&#xff1a;函数既变量&#xff1b;高阶函数&#xff1b;嵌套函数。 现在来尝试写装饰器 有两个函数 各自实现自…

java http请求实现_java工程实现http请求接口

java工程实现http请求接口java工程实现http请求接口1.实现代码package com.home;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.sun.net.httpserver.HttpExchange;import com.sun.net.httpserver.HttpHandler;import com.sun.net.https…

Java集合中removeIf的使用

使用removeIf方法从List中删除元素 在JDK1.8中&#xff0c;Collection以及其子类新加入了removeIf方法&#xff0c;作用是按照一定规则过滤集合中的元素。这里展示removeIf的用法。 需求是过滤掉学生中分数为为18以下的&#xff0c; 一个学生实体类 Data public class Studen…

Java中lombok @Builder注解使用详解

简介 Lombok大家都知道&#xff0c;在使用POJO过程中&#xff0c;它给我们带来了很多便利&#xff0c;省下大量写get、set方法、构造器、equal、toString方法的时间。除此之外&#xff0c;通过Builder注解&#xff0c;lombok还可以方便的实现建造者模式&#xff0c;创建对象 …

Java中Collections.singletonList用法

Collections.singletonList()返回的是不可变的集合&#xff0c;但是这个长度的集合只有1&#xff0c;可以减少内存空间。但是返回的值依然是Collections的内部实现类&#xff0c;同样没有add的方法&#xff0c;调用add&#xff0c;set方法会报错 调用add方法报错 Exception in…

CF Round410 D. Mike and distribution

D. Mike and distribution 构造法 798D - Mike and distribution In the beginning, its quite easy to notice that the condition " 2(ap1  ...  apk) is greater than the sum of all elements in A " is equivalent to " ap1  ...  apk is greater …

ADSL提速 从入门到精通

虽然现在的宽带速率已经很快了&#xff0c;但是大家还是希望在以下方面提升一下应用速度&#xff1a;电影BT下载时、在线影音播放时、FTP文件传送时等。广大网友也因此探寻出不少提升宽带速率的方法&#xff0c;那么&#xff0c;都有哪些简单可行的提速方法呢&#xff1f;它们的…

Swift开发图解入门

《论语卫灵公》有一段经典对白&#xff1a;『子贡问为仁。子曰&#xff1a;工欲善其事&#xff0c;必先利其器。……』。对于一个程序猿来说&#xff0c;好的工具不意味着一定能产生优质的代码。可是好的工具对提升开发效率的作用还是不言而喻的。想要用Swift做iOS开发。唯一可…

java 负数存储结构_负数在java中的存储和读取过程 | 学步园

问题描述&#xff1a;将-5存储在文本文件中&#xff0c;再读取出来显示到控制台;预备知识&#xff1a;1.在java中使用补码处理数字&#xff0c;而且byte(8)的数字在扩展成int(32)类型的时候&#xff0c;正数填充0&#xff0c;负数填充1;2.负数的转变过程&#xff0c;正数的原码…

一升的眼泪 日记原文+剧照

作者 木藤亚也14岁——我的家人  “我不能活动&#xff0c;可是我想活着……”   然而&#xff0c;我怎么也想不到&#xff0c;就在我生日这一天&#xff0c;却发生了一场悲剧——玛丽被邻居家养的大狗“老虎”咬破头&#xff0c;死了。玛丽虽然身体小小的&#x…