我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ASP.NET WebForm中怎么使用Ajax

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ASP.NET WebForm中怎么使用Ajax

这篇文章主要讲解了“ASP.NET WebForm中怎么使用Ajax”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET WebForm中怎么使用Ajax”吧!

对于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框架。先来看这个框架的实现机制:

ASP.NET WebForm中怎么使用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页面中创建一个被调用的测试方法:

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

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

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

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

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

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

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

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

var PowerAjax = function () { }  PowerAjax.__Private = function () { }     // 进行异步操作  PowerAjax.AsyncAjax = function (methodName, paramArray, success) {      PowerAjax.__Private.Ajax(methodName, paramArray, success, true);  }     // 进行的是同步操作  PowerAjax.SyncAjax = function (methodName, paramArray, success) {      PowerAjax.__Private.Ajax(methodName, paramArray, success, false);  }     PowerAjax.__Private.Ajax = function (methodName, paramArray, success, isAsync) {      var data = {};      switch (paramArray.length) {          case 0:              data = { 'isAjaxRequest': true, 'MethodName': methodName };              break;          case 1:              data = { 'isAjaxRequest': true, 'MethodName': methodName, "param0": paramArray[0] };              break;          case 2:              data = { 'isAjaxRequest': true, 'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1] };              break;          case 3:              data = { 'isAjaxRequest': true, 'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2] };              break;          case 4:              data = { 'isAjaxRequest': true, 'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2], "param3": paramArray[3] };              break;          case 5:              data = { 'isAjaxRequest': true, 'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2], "param3": paramArray[3], "param4": paramArray[4] };              break;      }         var url = document.location.href;      $.ajax({          type: "post",          url: url,          data: data,          async: isAsync,          datatype: "json",          contentType: "application/x-www-form-urlencoded; charset=UTF-8",          success: function (response) {              success(response);          },          error: function (response) {              if (response.status == 500) {                  var errorMessage = response.responseText;                  var errorTitle = errorMessage.substring(errorMessage.indexOf("<title>") + 7, errorMessage.indexOf("</title>"))                  throw new Error("服务器内部错误:" + errorTitle);              }          }      });  }

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

public partial class _Default : AjaxBasePage

6. 主要基类:AjaxBasePage类

如下代码:

public class AjaxBasePage : System.Web.UI.Page  {      /// <summary>      /// 是否是一个ajax请求。      /// </summary>      public bool IsAjaxRequest { get; private set; }       /// <summary>      ///  如果是Ajax请求,劫持页面生命周期的PreInit的事件,直接返回Response      /// </summary>      protected override void OnPreInit(EventArgs e)      {          AjaxRequest ajaxRequest = AjaxRequest.GetInstance(Request.Form);          this.IsAjaxRequest = ajaxRequest.IsAjaxRequest;           if (this.IsAjaxRequest)          {              AjaxApplication ajaxApplication = new AjaxApplication(this, ajaxRequest);              ajaxApplication.EndRequest();          }          else         {              // 如果不是Ajax请求,继续执行页面生命周期的剩余事件              base.OnPreInit(e);          }      }  }

该类重写了PreInit方法,判断请求是否是一个Ajax请求。通过AjaxRequest类接收并处理接收到的请求,提取出一些有效的数据,比如说是否是一个Ajax请求,方法的名字,参数列表(AjaxParameter类)。

至于AjaxParameter类,内部用的数据结构其实是一个字典,并使用索引来提供对数据的方便访问,提供一个Count属性,方便获取参数的个数。     如下代码

public class AjaxParameter      {          private IDictionary<int, string> m_DictionaryParamsData = new Dictionary<int, string>();             /// <summary>          /// 返回参数的个数。          /// </summary>          public int Count          {              get              {                  return this.m_DictionaryParamsData.Count;              }          }             /// <summary>          /// 索引具体参数的值。          /// </summary>          /// <param name="index"></param>          /// <returns></returns>          public string this[int index]          {              get              {                  if (index >= 5 || index < 0)                  {                      throw new NotSupportedException("请求方法的参数的个数限制为:0-5");                  }                  return this.m_DictionaryParamsData[index];              }          }             public AjaxParameter(IDictionary<int, string> paramsData)          {              this.m_DictionaryParamsData = paramsData;          }      }

AjaxRequest类的设计思路其实是模仿HttpContext设计,HttpContext能够从基础的http请求报文分析出以后处理将要用到的数据(response,request,session,cookie等等)数据,而AjaxRequest通过分析Ajax的Post请求的数据域 Data分析出各种以后会用到的数据。如下是该类的代码:

public class AjaxRequest      {          private Dictionary<int, string> m_DictionaryParamsData = new Dictionary<int, string>();          private AjaxParameter m_AjaxParameter;          private int m_Count = 0;             #region 属性          /// <summary>          /// 是否是一个Ajax请求。          /// </summary>          public bool IsAjaxRequest { get; private set; }             /// <summary>          /// 请求的方法名字。          /// </summary>          public string MethodName { get; private set; }             /// <summary>          /// 参数数据。          /// </summary>          public AjaxParameter Parameters          {              get { return this.m_AjaxParameter; }          }          #endregion             #region 构造函数          private AjaxRequest(NameValueCollection nameValueCollection)          {              this.IsAjaxRequest = nameValueCollection["isAjaxRequest"] == "true";              if (this.IsAjaxRequest)              {                  this.MethodName = nameValueCollection["MethodName"];                     foreach (string value in nameValueCollection)                  {                      string formKey = string.Format("param{0}", this.m_Count);                      if (nameValueCollection[formKey] != null)                      {                          this.m_DictionaryParamsData.Add(this.m_Count, nameValueCollection[formKey]);                          this.m_Count++;                      }                  }                  m_AjaxParameter = new AjaxParameter(this.m_DictionaryParamsData);              }          }             #endregion             #region 实例方法          public static AjaxRequest GetInstance(NameValueCollection nameValueCollection)          {              return new AjaxRequest(nameValueCollection);          }          #endregion             #region ToString          public override string ToString()          {              return this.MethodName;          }          #endregion      }

通过分析AjaxRequest的属性IsAjaxRequest可判断是否为Ajax请求,若该请求为一个Ajax请求,那么创建一个AjaxApplication实例,在创建AjaxApplication实例的过程中会利用当前页面和AjaxRequest提供的数据进行实际方法的调用(反射),该类是执行Ajax方法的核心类,其中会判断是否读取的到的方法是一个有效的方法,并判断从JS中AjaxApplication传入的参数类型的有效性,目前只提供对以下13中参数提供支持,如下:

(String、Boolean、Int32、Int64、UInt32、UInt64、Single、Double、Decimal、DateTime、DateTimeOffset、TimeSpan、Guid)

如果方法中出现非以上类型,将会抛出异常。为了方便Ajax的调试,在JS前段类库中我会对异常进行处理,并抛出Error,Error信息有效的截取了继承自Exception的抛出信息,至于如何获    得更加详细的JS调试信息,以后JS库中可能会做提供更加详细的调用信息,毕竟框架是在改进中进行的。如下是AjaxApplication类的具体代码:

public class AjaxApplication      {          private AjaxBasePage m_AjaxBasePage;          private object m_ResponseData;             public AjaxApplication(AjaxBasePage ajaxBasePage, AjaxRequest ajaxRequest)          {              this.m_AjaxBasePage = ajaxBasePage;              Type ajaxBasePageType = ajaxBasePage.GetType();              MethodInfo methodInfo = ajaxBasePageType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)                                          .FirstOrDefault(item => item.Name == ajaxRequest.MethodName);              object[] parameterData = this.GetParameterData(ajaxRequest, methodInfo);                 if (methodInfo.IsStatic)              {                  this.m_ResponseData = methodInfo.Invoke(null, parameterData);              }              else             {                  this.m_ResponseData = methodInfo.Invoke(ajaxBasePage, parameterData);              }          }             /// <summary>          /// 获取参数数据。          /// </summary>          private object[] GetParameterData(AjaxRequest ajaxRequest, MethodInfo methodInfo)          {              if (methodInfo != null)              {                  ParameterInfo[] parameterInfos = methodInfo.GetParameters();                     if (parameterInfos.Length > 5)                  {                      throw new NotSupportedException("最多支持5个参数");                  }                     if (parameterInfos.Length > ajaxRequest.Parameters.Count)                  {                      throw new ArgumentException("缺少参数!");                  }                     List<object> parameterData = new List<object>(parameterInfos.Length);                  for (int i = 0; i < parameterInfos.Length; i++)                  {                      ParameterInfo parameterInfo = parameterInfos[i];                      string paramValue = ajaxRequest.Parameters[i];                         try                     {                          parameterData.Add(ParseAjaxParameter(paramValue, parameterInfo));                      }                      catch (FormatException)                      {                          string format = string.Format("传入静态方法 {0} 的第 {1} 个(从0开始计数)参数类型不匹配,应该为 {2} 类型 请检查!", methodInfo.Name, i, parameterInfo.ParameterType.Name);                          throw new FormatException(format);                      }                  }                  return parameterData.ToArray();              }              else             {                  throw new InvalidOperationException("没有发现此方法,请检查该方法签名(方法必须为public)");              }          }             /// <summary>          /// 类型转换。支持 String、Boolean、Int32、Int64、UInt32、UInt64、Single、Double、Decimal、DateTime、DateTimeOffset、TimeSpan、Guid          /// </summary>          private object ParseAjaxParameter(string ajaxParameterValue, ParameterInfo parameterInfo)          {              object obj;              if (parameterInfo.ParameterType == typeof(String))              {                  obj = ajaxParameterValue;              }              else if (parameterInfo.ParameterType == typeof(Boolean))              {                  obj = bool.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(Int32))              {                  obj = Int32.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(UInt32))              {                  obj = UInt32.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(UInt64))              {                  obj = UInt64.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(Single))              {                  obj = Single.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(Double))              {                  obj = Double.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(Decimal))              {                  obj = Decimal.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(DateTime))              {                  obj = DateTime.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(DateTimeOffset))              {                  obj = DateTimeOffset.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(TimeSpan))              {                  obj = TimeSpan.Parse(ajaxParameterValue);              }              else if (parameterInfo.ParameterType == typeof(Guid))              {                  obj = Guid.Parse(ajaxParameterValue);              }              else             {                  throw new NotSupportedException("方法参数类型不支持!");              }              return obj;          }             /// <summary>          /// 结束页面生命周期,同时直接执行应用程序生命周期的EndRequest事件。          /// </summary>          public void EndRequest()          {              HttpResponse response = this.m_AjaxBasePage.Page.Response;              response.ContentType = "application/json";              response.Clear();              JavaScriptSerializer jsonSerializer2 = new JavaScriptSerializer();              response.Write(jsonSerializer2.Serialize(new JsonResponse { IsSuccess = true, Message = "处理成功", ResponseData = this.m_ResponseData }));              response.End();          }      }

当初始化了一个AjaxApplication实例后, 可以调用该实例的EndRequest()方法,来结束Ajax请求。该方法内部最后调用Response.End()方法来结束页面生命周期和大部分管线事件。

并用JsonResponse类来封装返回数据。

public class JsonResponse  {      public bool IsSuccess { get; set; }      public string Message { get; set; }      public object ResponseData { get; set; }  }

该类最后一个参数即承载了调用方法的返回值,为一个Object类型,也就是说,框架可以支持任何类型的返回值,当然该类型可以被序列化。

7. 回过头来再看Ajax请求,针对返回值可以这样用:

PowerAjax.AsyncAjax('TestAjaxMethod', [1, 2, "333", "sss"], function (SucceessResponse) {      if (SucceessResponse.IsSuceess) {          alert("恭喜,该ajax方法调用成功!");          Process(SucceessResponse.ResponseData); // 处理返回的数据,这里可能需要你自己实现了,因为我无法判断你要返回的是什么东西,这是个Object      } else {          alert("这是操作错误奥,不是内部异常,内部异常的抛出会我内部会处理的!");          alert("错误信息:" + SucceessResponse.Message);      }  });

感谢各位的阅读,以上就是“ASP.NET WebForm中怎么使用Ajax”的内容了,经过本文的学习后,相信大家对ASP.NET WebForm中怎么使用Ajax这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ASP.NET WebForm中怎么使用Ajax

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ASP.NET WebForm中怎么使用Ajax

这篇文章主要讲解了“ASP.NET WebForm中怎么使用Ajax”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET WebForm中怎么使用Ajax”吧!对于asp.net W
2023-06-17

ASP.NET中Ajax怎么使用

ASP.NET中使用Ajax有多种方法,以下是一种常用的方法:1. 首先,在ASP.NET Web Forms项目中,需要引入jQuery库。可以通过在页面的头部添加以下代码来引入jQuery库:```html```2. 在前端页面中定义一
2023-08-14

ASP.NET WebForm重写URL怎么理解

本篇内容主要讲解“ASP.NET WebForm重写URL怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET WebForm重写URL怎么理解”吧!进行开发ASP.NET We
2023-06-17

ASP.NET中Ajax如何使用

在ASP.NET中,可以使用Ajax进行异步通信和更新页面,以下是使用Ajax的步骤:1. 引入jQuery库:在页面中引入jQuery库,可以通过将以下代码添加到页面的标签中来实现:```html```2. 创建一个ASP.NET Web
2023-08-14

ASP.NET中 MVC与WebForm的区别是什么

这篇文章给大家介绍ASP.NET中 MVC与WebForm的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。ASP.NET MVC与WebForm区别谈使用ASP.NET MVC框架,创建默认项目,***直观感
2023-06-17

ASP.NET Core中怎么利用 Razor处理Ajax请求

这篇文章将为大家详细讲解有关ASP.NET Core中怎么利用 Razor处理Ajax请求,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。RazorRazor Pages是ASP.NET Co
2023-06-19

ASP.NET中request.form怎么使用

在ASP.NET中,Request.Form是一个集合,用于获取由客户端POST方法发送的HTTP请求中包含的表单数据。你可以使用Request.Form集合的索引器来访问特定表单字段的值,如下所示:```csharpstring fiel
2023-08-08

ASP.NET中Server.MapPath怎么使用

在ASP.NET中,Server.MapPath方法用于将虚拟路径映射到物理文件路径。使用Server.MapPath方法的一般语法如下:```Server.MapPath(path)```其中,path是一个相对于当前页面的虚拟路径,也可
2023-09-26

asp.net中viewState怎么使用

在ASP.NET中,ViewState是用于在页面回发时存储页面的状态信息的一种机制。要使用ViewState,需要进行以下步骤:1. 在页面或控件的代码中设置EnableViewState属性为true。默认情况下,EnableViewS
2023-09-13

asp.net中CodeSmith怎么使用

CodeSmith是一个代码生成工具,可以帮助开发人员快速生成代码。在ASP.NET中使用CodeSmith可以按照以下步骤进行:1. 下载并安装CodeSmith。可以从CodeSmith官方网站下载安装程序,并按照提示进行安装。2. 打
2023-09-26

ASP.Net中EnableViewState怎么使用

在ASP.Net中,EnableViewState属性用于指定是否启用ViewState机制来跟踪页面的状态。默认情况下,EnableViewState属性被设置为true。如果要在ASP.Net页面中禁用ViewState,可以将Enab
2023-09-26

ajax中responseText怎么使用

在Ajax中,responseText是XMLHttpRequest对象的一个属性,用于存储从服务器返回的响应文本。使用responseText的一般步骤如下:1. 创建一个XMLHttpRequest对象:```var xhr = new
2023-08-25

ajax中responseXML怎么使用

要使用Ajax中的responseXML,你可以按照以下步骤进行操作:1. 创建一个XMLHttpRequest对象:```var xhr = new XMLHttpRequest();```2. 设置onreadystatechange事
2023-08-25

ASP.NET使用Ajax的方法有哪些

在ASP.NET中,使用Ajax的方法有以下几种:1. 使用UpdatePanel控件:UpdatePanel控件是ASP.NET中的一个容器控件,可以将需要进行异步刷新的部分放置在其中。通过设置UpdatePanel的属性,可以实现页面部
2023-09-26

Asp.net中的DataBinder.Eval怎么使用

在ASP.NET中,DataBinder.Eval方法用于从绑定的数据源中检索属性的值。它通常与数据绑定控件一起使用,如GridView,Repeater,DataList等。下面是DataBinder.Eval方法的基本语法:<%#
Asp.net中的DataBinder.Eval怎么使用
2024-03-02

怎么在ASP.NET中使用LazyCache

怎么在ASP.NET中使用LazyCache?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。LazyCache 是一款基于内存的易于使用和线程安全的缓存组件,值得
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录