`
fuxichakan
  • 浏览: 4505 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

反射+特性打造简洁的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页面就可以直接体验效果了。文章写的比较匆忙,如果你有任何疑问或建议都请告诉我。。。好啦,就到这里吧

文件下载:下载

0
5
分享到:
评论

相关推荐

    在ashx中利用反射+jquery轻松处理ajax

    标题中的“在ashx中利用反射+jquery轻松处理ajax”是指使用ASP.NET的HTTP Handler (ASHX) 结合反射和jQuery技术,实现高效且简洁的AJAX交互。这是一个常见的Web开发场景,尤其在处理异步数据请求时。下面将详细阐述...

    js定时器+ajax,间隔10s调用一次

    主要用于消息提醒,利用js页面定时器,定时提交ajax请求,查询最新的消息记录。改了很多次,终于成功了。

    ZTree+Struts2+ajax+json实现checkbox权限树

    【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...

    SSH+jQuery+json 实现的Ajax操作,绝对精华,代码简练清晰,绝对能看明白

    2. **链式操作**:jQuery的链式调用特性使得代码更加简洁。例如,可以使用`$("#select-province").change(function() {...})`监听省份选择的改变事件。 **JSON** JSON(JavaScript Object Notation)是一种轻量级...

    jQuery使用Ajax方法调用WebService.doc

    ### jQuery使用Ajax方法调用WebService知识点详解 #### 一、简介 在Web开发领域中,Ajax(Asynchronous JavaScript and XML)技术被广泛应用于实现页面局部刷新等功能,极大地提升了用户体验。结合jQuery这一流行的...

    C#工厂模式结合反射+配置文件+外观模式实例

    在这个实例中,可能会有一个外观类,该类负责调用工厂方法、处理配置文件和利用反射创建及管理对象,对外提供简洁的接口,隐藏内部实现细节。 5. **整合应用**: 将以上四个概念整合到一起,我们可以构建一个高度...

    详解Golang利用反射reflect动态调用方法

    反射是许多现代编程语言中的一项重要特性,它允许程序在运行时检查和操作自身的内部结构。Go 语言同样具备这样的能力,它通过 `reflect` 包提供了一套完整的反射机制。本文将详细介绍如何在 Go 语言中利用反射来动态...

    ajax调用数据

    下面将详细阐述Ajax调用不同类型数据的方法。 1. **Ajax调用无参的后台方法数据** 当你需要从服务器获取数据但无需传递任何参数时,可以使用Ajax进行无参调用。基本流程包括创建XMLHttpRequest对象、初始化请求、...

    使用ScriptManager+Ajax调用WCF服务(为服务定义接口)

    此程序为使用ScriptManager+Ajax调用WCF服务(为服务定义接口),其中有些问题讨论,请参考博客:http://blog.csdn.net/zaijianluoye110/article/details/25361225

    Asp.net中JQuery、ajax调用后台方法总结

    Asp.net 中 jQuery、ajax 调用后台方法总结 在 Asp.net 中,使用 jQuery 和 Ajax 调用后台方法是一种常见的做法。下面总结了几种常见的调用方法。 有参数的方法调用 在前台使用 jQuery 代码调用后台方法时,需要...

    使用js+ajax调用WCF服务

    在本文中,我们将深入探讨如何使用JavaScript(JS)和AJAX技术来调用Windows Communication Foundation(WCF)服务。WCF是.NET Framework提供的一种全面的服务导向架构,用于构建可互操作的分布式系统。AJAX...

    ajax和JavaScript分别调用Webservice实例

    本压缩包包含的三个文档详细讲解了如何利用Ajax和JavaScript来调用WebService,这对于理解这两种技术的集成至关重要。 首先,让我们了解一下Ajax。Ajax是一种在不刷新整个网页的情况下,能够更新部分网页内容的技术...

    C#反射+委托案例 c#经典案例.pdf

    C#反射是指在运行时动态地获取类型信息和调用类型成员的能力。反射的定义是审查元数据并收集关于它的类型信息的能力。元数据是编译以后最基本的数据单元,它是一个大堆的表,当编译程序集或者模块时,编译器会创建一...

    ajax 调用 进度显示

    以下是一个简单的示例,展示了如何使用这些特性来显示Ajax上传的进度: ```javascript var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.upload.onprogress = function(event) { if (event....

    jQuery使用Ajax方法调用WebService

    本文将深入探讨如何使用jQuery的Ajax方法来调用WebService,从而实现异步数据交换,提升用户体验。 首先,理解Ajax(Asynchronous JavaScript and XML)的核心概念是关键。Ajax允许网页在不刷新整个页面的情况下与...

    ajax+servlet

    ajax+servletajax+servletajax+servletajax+servletajax+servletajax+servletajax+servletajax+servletajax+servletajax+servlet

    .net反射与特性的使用方法

    反射是.NET框架的一个核心特性,它允许程序在运行时检查自身的信息,如类型、属性、方法等,并能动态地创建对象和调用成员。反射通过System.Reflection命名空间中的类来实现,如Type、MethodInfo、PropertyInfo等。...

    php+jquery+ajax最简单例子

    这个“php+jquery+ajax最简单例子”旨在教你如何使用这些工具实现一个基本的异步数据交换功能。 首先,让我们深入了解这三个概念: 1. PHP(Hypertext Preprocessor):这是一种服务器端脚本语言,主要用于网页...

    asp.net 利用jquery-ajax调用后台方法

    在ASP.NET中,我们通常创建一个WebMethod或使用ASP.NET MVC的ActionResult来作为AJAX的调用目标。`$.ajax()`是jQuery提供的一个核心函数,用于发起异步HTTP请求。下面将详细介绍如何利用jQuery-AJAX调用ASP.NET后台...

    学生管理系统SpringMVC+Mybatis+Ajax

    Ajax的异步特性减少了页面加载时间,提高了系统的响应速度。 四、Ajax与SpringMVC、Mybatis的集成 在SpringMVC中,可以通过jQuery库或者原生JavaScript来实现Ajax请求。这些请求通常会触发由SpringMVC控制器处理的...

Global site tag (gtag.js) - Google Analytics