反射+特性打造简洁的AJAX调用
这里我要实现类似AjaxPro组件调用效果的功能,先看看AjaxPro在CS文件中的代码是怎么写的。
//在后台写的有参方法 [AjaxPro.AjaxMethod] public string getString(string str) { return str + "Say: hello my friends"; }
前台页面的调用方式
function Button4_onclick() { var str=document.getElementByIdx_x("<%=TextBox1.ClientID %>").value; WebUI._Default.getString(str,getStringCallBack); }
这样的调用代码相当于在客户端直接执行了服务器端代码,然后取到执行结果,是不是有点意思,接下来我们就来自己把这类似的功能实现一把。
不过在实现之前你最好对反射和特性的基本运用有一定的了解,马上进入正题。
首先我们来理一下实现的思路
1.定义能应用在方法上的Ajax标识特性,因为并不是Page对象的所有方法都需要公开被调用,可以用特性做一个标记,可以通过MethodAliasName属性为方法设置一个方法别名,这样做的目的主要是为了安全和AJAX调用代码更简洁。
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace AjaxInvokeDemo.Ajax { [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class AjaxMethodAttribute : Attribute { /// <summary> /// 设置ajax调用时的方法别名 /// </summary> public string MethodAliasName { get; set; } } }
2.定义页面基类,在里面实现一些公用的逻辑。比如获取要执行的方法的名称以及方法的参数,并通过反射对方法进行调用。具体还是看代码吧,可能更清楚一点。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Runtime; using System.Reflection; using System.Collections.Specialized; namespace ConfigDemo.Ajax { public abstract class AjaxPage<T> : System.Web.UI.Page { private static readonly string AjaxMethodCacheName = "AjaxMethods"; private string pageName = typeof(T).Name; private Type pageType = typeof(T); protected override void OnPreInit(EventArgs e) { if (Cache[AjaxMethodCacheName] == null) { AjaxMethods = AjaxHelper.GetAjaxMethods<T>(); Cache[AjaxMethodCacheName] = AjaxMethods; } else { AjaxMethods = Cache[AjaxMethodCacheName] as Dictionary<string, string>; } base.OnPreInit(e); } protected override void OnLoad(EventArgs e) { ExecuteAction(); base.OnLoad(e); } public Dictionary<string, string> AjaxMethods { get; set; } /// <summary> /// Action名称或者别名 /// </summary> public string CurrentActionName { get { if (!string.IsNullOrEmpty(HttpContext.Current.Request["action"])) { return HttpContext.Current.Request["action"]; } throw new Exception("调用时必须指定Action参数.."); } } /// <summary> /// 传递的参数集合 /// </summary> public object[] CurrentParams { //一般的调用URL格式为 http://xxxxx/yyy.aspx?action=method&id=a001 ... get { NameValueCollection NVs = HttpContext.Current.Request.QueryString; object[] objs = new object[NVs.Count-1]; //这里将action参数排除在外 for(int i =1;i<NVs.Count; i++) { objs[i-1] = NVs[i]; } return objs; } } /// <summary> /// 最终要执行的Page的方法的真实名称 /// </summary> public string CurrentAjaxMethodName { get; set; } public void ExecuteAction() { if (!AjaxMethods.ContainsKey(CurrentActionName) && !AjaxMethods.ContainsValue(CurrentActionName)) { throw new Exception("调用的方法不存在或者未被公开为Ajax方法.."); } //没有为Ajax方法指定别名 if (AjaxMethods.ContainsKey(CurrentActionName) && AjaxMethods[CurrentActionName] == CurrentActionName) { CurrentAjaxMethodName = CurrentActionName; } else { //为Ajax方法指定了别名 CurrentAjaxMethodName = AjaxMethods.First<KeyValuePair<string, string>>(x => x.Value == CurrentActionName).Key; } MethodInfo method = pageType.GetMethod(CurrentAjaxMethodName); if (method != null) { object PageObj = GetPageInstance(); method.Invoke(PageObj, CurrentParams); } } public object GetPageInstance() { if (Cache[pageName] == null) { object PageObj = Activator.CreateInstance(pageType); return Cache[pageName] = PageObj; } else { return Cache[pageName] as object; } } } }
3.为了获取被标识为AjaxMethod的方法集合,这里专门用一个AjaxHelper类实现。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Reflection; namespace ConfigDemo.Ajax { public class AjaxHelper { /// <summary> /// 获取指定Page对象中标记为Ajax的方法集合 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="page"></param> /// <returns></returns> public static Dictionary<string,string> GetAjaxMethods<T>() { Dictionary<string, string> ajaxMethods = new Dictionary<string, string>(); AjaxMethodAttribute ajaxMethodAttribute = null; //方法别名 string methodAliasName = string.Empty; Type t = typeof(T); MethodInfo[] methods = t.GetMethods(); foreach (MethodInfo method in methods) { object[] attributes = method.GetCustomAttributes(typeof(AjaxMethodAttribute), false); if (attributes != null && attributes.Length > 0) { ajaxMethodAttribute = (AjaxMethodAttribute)attributes[0]; //如果没有为ajax调用方法设置别名则用方法本身的名称 methodAliasName = string.IsNullOrEmpty(ajaxMethodAttribute.MethodAliasName) == true ? method.Name : ajaxMethodAttribute.MethodAliasName; ajaxMethods.Add(method.Name, methodAliasName); } } return ajaxMethods; } } }
4.基础框架搭建完毕,看看怎么使用
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Reflection; using System.Text; namespace AjaxInvokeDemo.Ajax { public partial class Index : AjaxPage<Index> { protected void Page_Load(object sender, EventArgs e) { } [AjaxMethod] public void GetPerson(string id) { List<Person> ps = new List<Person>(); ps.Add(new Person { Id = "a001", Name = "abc", Sex = "男", Age = 20 }); ps.Add(new Person { Id = "a002", Name = "xyz", Sex = "女", Age = 18 }); ps.Add(new Person { Id = "a003", Name = "zzzz", Sex = "男", Age = 28 }); ps.Add(new Person { Id = "a004", Name = "yyy", Sex = "男", Age = 21 }); StringBuilder builder = new StringBuilder(); Person person = ps.Find(p => p.Id == id); if (person != null) { //http://htmltextwriterutil.codeplex.com/ 这是htmltextwriter工具的下载地址,一款拼字符串的好工具 builder.Append(" <ul>"); builder.AppendFormat(" <li>编号:{0}</li>",person.Id); builder.AppendFormat(" <li>姓名:{0}</li>", person.Name); builder.AppendFormat(" <li>性别:{0}</li>", person.Sex); builder.AppendFormat(" <li>年龄:{0}</li>", person.Age); builder.Append(" </ul>"); } HttpContext.Current.Response.Write(builder.ToString()); HttpContext.Current.Response.End(); } } public class Person { public string Id { get; set; } public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } } }
这里的使用有两个要点,一是页面要继承自AjaxPage<T>泛型类,第二是在要被客户端调用的方法上加上[AjaxMethod]特性,一切就这么简单。。
5.客户端调用
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AjaxTest.aspx.cs" Inherits="AjaxInvokeDemo.Ajax.AjaxTest" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript" src="../Scripts/jquery-1.4.1.min.js"></script> <script type="text/javascript"> $(function(){ $("#btn").click(function(){ $("#box").load("Index.aspx?action=GetPerson&id="+$("#txtId").val()); }); }); </script> </head> <body> <form id="form1" runat="server"> 用户ID:<input type="text" id="txtId" value="a001"/><input type="button" id="btn" value="查询"/> <div id="box"> </div> </form> </body> </html>
至此,调用完毕。。。
最后,还是附上代码吧。下载网站项目之后里面你会看到一个叫做AJAx的文件夹,里面就是所有代码了,运行AjaxTest.aspx页面就可以直接体验效果了。文章写的比较匆忙,如果你有任何疑问或建议都请告诉我。。。好啦,就到这里吧
文件下载:下载
相关推荐
标题中的“在ashx中利用反射+jquery轻松处理ajax”是指使用ASP.NET的HTTP Handler (ASHX) 结合反射和jQuery技术,实现高效且简洁的AJAX交互。这是一个常见的Web开发场景,尤其在处理异步数据请求时。下面将详细阐述...
在这个“asp.net+jquery+ajax所有调用例子”中,我们将深入探讨如何结合这些技术来实现高效的用户交互。 首先,ASP.NET AJAX提供了UpdatePanel组件,使得页面的部分区域可以异步更新,而无需整个页面的回发。通过在...
主要用于消息提醒,利用js页面定时器,定时提交ajax请求,查询最新的消息记录。改了很多次,终于成功了。
【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...
jQuery的核心特性包括选择器(用于快速定位DOM元素)、链式调用(使代码更简洁)和插件系统(扩展功能)。例如,在JqueryTest中,你可以看到如何使用jQuery选择器找到页面元素,然后通过`$(selector).function()`的...
下面将详细阐述Ajax调用不同类型数据的方法。 1. **Ajax调用无参的后台方法数据** 当你需要从服务器获取数据但无需传递任何参数时,可以使用Ajax进行无参调用。基本流程包括创建XMLHttpRequest对象、初始化请求、...
此程序为使用ScriptManager+Ajax调用WCF服务(为服务定义接口),其中有些问题讨论,请参考博客:http://blog.csdn.net/zaijianluoye110/article/details/25361225
Asp.net 中 jQuery、ajax 调用后台方法总结 在 Asp.net 中,使用 jQuery 和 Ajax 调用后台方法是一种常见的做法。下面总结了几种常见的调用方法。 有参数的方法调用 在前台使用 jQuery 代码调用后台方法时,需要...
在本文中,我们将深入探讨如何使用JavaScript(JS)和AJAX技术来调用Windows Communication Foundation(WCF)服务。WCF是.NET Framework提供的一种全面的服务导向架构,用于构建可互操作的分布式系统。AJAX...
`<Ajax.AjaxMethod(Ajax.HttpSessionStateRequirement.ReadWrite)> _`这个特性标记了一个方法为可以被AJAX调用的服务器端方法,并指定它需要读写会话状态。这样,当你在前端通过AJAX调用这个方法时,它可以在不刷新...
本压缩包包含的三个文档详细讲解了如何利用Ajax和JavaScript来调用WebService,这对于理解这两种技术的集成至关重要。 首先,让我们了解一下Ajax。Ajax是一种在不刷新整个网页的情况下,能够更新部分网页内容的技术...
以下是一个简单的示例,展示了如何使用这些特性来显示Ajax上传的进度: ```javascript var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.upload.onprogress = function(event) { if (event....
本文将深入探讨如何使用jQuery的Ajax方法来调用WebService,从而实现异步数据交换,提升用户体验。 首先,理解Ajax(Asynchronous JavaScript and XML)的核心概念是关键。Ajax允许网页在不刷新整个页面的情况下与...
ajax+servletajax+servletajax+servletajax+servletajax+servletajax+servletajax+servletajax+servletajax+servletajax+servlet
**Ajax调用WCF服务详解** 在Web开发中,Asynchronous JavaScript and XML(Ajax)技术被广泛用于实现页面的无刷新更新,提高了用户体验。而Windows Communication Foundation(WCF)是微软提供的一种强大的服务导向...
反射是.NET框架的一个核心特性,它允许程序在运行时检查自身的信息,如类型、属性、方法等,并能动态地创建对象和调用成员。反射通过System.Reflection命名空间中的类来实现,如Type、MethodInfo、PropertyInfo等。...
在ASP.NET中,我们通常创建一个WebMethod或使用ASP.NET MVC的ActionResult来作为AJAX的调用目标。`$.ajax()`是jQuery提供的一个核心函数,用于发起异步HTTP请求。下面将详细介绍如何利用jQuery-AJAX调用ASP.NET后台...
python3+flask框架,前端html+css+bootstrap框架+js+jq+ajax,前端弹窗用的是sweetalert2,注册界面短信验证码调用的是阿里大鱼短信接口,图形验证码是用 python中PIL图形处理工具画的,验证码缓存是用的memcache,用...
C# AJAX调用结合了C#的强大服务器处理能力和JavaScript的动态特性,为Web应用带来了更好的用户体验。跨域AJAX调用如JSONP则是现代Web应用中不可或缺的部分,它让不同源的服务器间的数据共享成为可能。理解并熟练掌握...
【标题】"spring+mybatis+springmvc+ajax简单聊天室"揭示了这是一个基于Java技术栈构建的在线聊天室应用。这个项目的核心是利用Spring框架的各组件(Spring、MyBatis、SpringMVC)来处理后端逻辑,并通过Ajax实现...