点击这里给我发消息 点击这里给我发消息

ASP.NET WebForm也可以这样用Ajax(一)

添加时间:2013-12-6
    相关阅读: ASP ASP.NET 解决方案 方案 页面 程序 框架
 

对于asp.net WebForm项目,进行Ajax操作大概有三种方式:web服务(.asmx文件)  ,  一般处理程序(.ashx)和  一些Ajax控件。

对于.net提供的ajax控件,暂且不说,只说另外两种方式,都需要引入额外的代码文件对Ajax进行操作(asmx和ashx,且web服务还要引入一个cs文件与之对应),假如要对Example.aspx这个页面添加一些自定义的Ajax操作,并且这些Ajax操作并不会在别的页面上用到,如此不得不引入额外的代码文件完成这个操作,假如这个Ajax操作很简单,只需要一个简单的函数就可以执行,那岂不是很麻烦的过程吗?如此一来,随着项目中 Ajax操作的增多,ashx和asmx文件都会随着时间的增长而增长,项目的维护也会随之加倍。为什么我们不能把Ajax操作的后台代码直接放在 Example.aspx对应的Example.aspx.cs文件里 ? 如果能这样做,以上两种烦恼都会迎刃而解,不是吗?

于是,按照以上思路,实现了如下Ajax框架。先来看这个框架的实现机制:

上图是自己画的一个缩减版IIS接收到一个aspx请求的HttpApplication管线和asp.net Page在执行ProcessRequest()方法中的页面生命周期的部分事件。Page本身是继承自IHttpHandler接口,IHttpHandler提供了一个重要的约束方法ProcessRequest,该方法是对接收到的信息(HttpContext)进行具体的处理同样,一般处理程序和web服务也实现了自己的IHttpHandler,并以此提供一些Ajax服务。具体的操作过程请自行查找MSDN。

原理是在页面生命周期开始的第一个事件PreInit进行一些处理,一旦发现劫持到的请求是一个ajax请求,那么利用C#的反射来调用aspx.cs中定义的方法,执行完方法之后,调用Response.End()方法,调用这个方法会直接跳到管线的EndRequest事件,从而结束请求,这样就无需走一些没有必要的页面生命周期的步骤,从而完成一个Ajax操作。如果发现是一个正常的操作,那么就走正常流程。

下面以一个简单例子说明该Ajax框架的使用:

1. 添加一个解决方案

2. 新建一个 Default.aspx 页面

3. 在Default.aspx.cs页面中创建一个被调用的测试方法:

  1. public List<string>  TestAjaxMethod(int a, string b, float c)  
  2.         {  
  3.                return new List<string> { a.ToString(), b, c.ToString() };  
  4.         } 

4.      在Default.aspx中写一个Ajax请求

  1. PowerAjax.AsyncAjax(‘TestAjaxMethod’, [1, 2, "333","sss"], function (SucceessResponse) {  
  2.         // 成功后的代码  
  3. }); 

PowerAjax.js是用Jquery专门为这个框架封装的一个及其简单的JS类库,这个类库中有两个主要的方法:PowerAjax.AsyncAjax和PowerAjax.SyncAjax,一个提供同步操作,一个提供异步操作,参数有三个:

第一个参数是即将操作在aspx.cs的Ajax方法的名字(用名字反射方法)。

第二个参数是一个以数组形式组成参数列表数据。

第三个参数是操作成功之后执行执行的回调方法,与c#中的委托一个道理。

以下为这个简单JS库的代码:

  1. var PowerAjax = function () { }  
  2. PowerAjax.__Private = function () { }  
  3.    
  4. // 进行异步操作  
  5. PowerAjax.AsyncAjax = function (methodName, paramArray, success) {  
  6.     PowerAjax.__Private.Ajax(methodName, paramArray, success, true);  
  7. }  
  8.    
  9. // 进行的是同步操作  
  10. PowerAjax.SyncAjax = function (methodName, paramArray, success) {  
  11.     PowerAjax.__Private.Ajax(methodName, paramArray, success, false);  
  12. }  
  13.    
  14. PowerAjax.__Private.Ajax = function (methodName, paramArray, success, isAsync) {  
  15.     var data = {};  
  16.     switch (paramArray.length) {  
  17.         case 0:  
  18.             data = { 'isAjaxRequest'true'MethodName': methodName };  
  19.             break;  
  20.         case 1:  
  21.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0] };  
  22.             break;  
  23.         case 2:  
  24.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1] };  
  25.             break;  
  26.         case 3:  
  27.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2] };  
  28.             break;  
  29.         case 4:  
  30.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2], "param3": paramArray[3] };  
  31.             break;  
  32.         case 5:  
  33.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2], "param3": paramArray[3], "param4": paramArray[4] };  
  34.             break;  
  35.     }  
  36.    
  37.     var url = document.location.href;  
  38.     $.ajax({  
  39.         type: "post",  
  40.         url: url,  
  41.         data: data,  
  42.         async: isAsync,  
  43.         datatype: "json",  
  44.         contentType: "application/x-www-form-urlencoded; charset=UTF-8",  
  45.         success: function (response) {  
  46.             success(response);  
  47.         },  
  48.         error: function (response) {  
  49.             if (response.status == 500) {  
  50.                 var errorMessage = response.responseText;  
  51.                 var errorTitle = errorMessage.substring(errorMessage.indexOf("<title>") + 7, errorMessage.indexOf("</title>"))  
  52.                 throw new Error("服务器内部错误:" + errorTitle);  
  53.             }  
  54.         }  
  55.     });  

5. 更改Default.aspx.cs的继承页面为AjaxBasePage              

  1. public partial class _Default : AjaxBasePage 
咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册