开发者社区> ghost丶桃子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法

简介:
+关注继续查看

        我们都知道在AjaxPro的方法AjaxPro.Utility.RegisterTypeForAjax(typeof(所在类的类名));会将标记有[Ajax.AjaxMethod]方法注册在客户端。在某项目中,设计模板字段引擎,采用html+jquery实现,这里的数据就难免需要ajax获取,但是团队对于js掌握不一,所以我写了下面辅助类,可以像ajaxpro一样简化ajax的开发。

代码-jQueryInvokeMethodAttribute (此处只做标示方法处理,所以为空):

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false,Inherited=false)] 
    public class jQueryInvokeMethodAttribute : Attribute 
    { 
    }

代码-jQueryAjaxUtility(分注册脚本和调用ajax事件):

ExpandedBlockStart.gif
复制代码
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Green.Utility 

    public class jQueryAjaxUtility 
    { 
        public static string AjaxInvokeParam = "AjaxInvoke"
        public static string AjaxInvokeValue = "1"
        public static string ResponseCharset = "UTF-8"

        protected static System.Web.UI.Page Page 
        { 
            get 
            { 
                return System.Web.HttpContext.Current.Handler as System.Web.UI.Page; 
            } 
        } 

        public static void RegisterClientAjaxScript(Type type) 
        { 
            if (Page != null
            { 
                if (System.Web.HttpContext.Current.Request[AjaxInvokeParam] == AjaxInvokeValue) 
                { 
                    RegisterAjaxInvokeEvent(type); 
                } 
                else 
                { 
                    RegisterAjaxInvokeScript(type); 
                } 
            } 
        } 

        protected static void RegisterAjaxInvokeScript(Type type) 
        { 

            Page.ClientScript.RegisterClientScriptBlock(type.GetType(), type.GetType().FullName + "_" + typeof(jQueryAjaxUtility).FullName + "_AjaxInvokeDefaultOption""window.defaultAjaxOption={type:'GET',cache:false, dataType:'text'};"true); 

            if (!jQueryUtilityCache.Current.Exists(type)) 
            { 
                var methodinfo = type.GetMethods(System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).Where(t => 
                { 
                    var attrs = t.GetCustomAttributes(typeof(jQueryInvokeMethodAttribute), false); 
                    if (attrs != null && attrs.Length > 0
                        return true
                    return false
                }).ToList(); 

                if (methodinfo != null && methodinfo.Count > 0
                { 
                    System.Text.StringBuilder sb = new StringBuilder(); 
                    sb.AppendFormat(" window.{0}=function(){{}}; ", type.Name); 
                    methodinfo.ForEach(t => 
                    { 
                        var parameters = t.GetParameters().Select(p => p.Name).ToArray(); 
                        sb.AppendFormat(" {2}.{0} = function ({1} ajaxOption) {{", t.Name, parameters.Count() > 0 ? string.Join(",", parameters) + "," : "", type.Name); 
                        sb.Append("if(ajaxOption==null||typeof ajaxOption=='undefined'){ajaxOption={};};"); 
                        var url = Page.Request.RawUrl.IndexOf("?") == -1 ? Page.Request.RawUrl : Page.Request.RawUrl.Substring(0, Page.Request.RawUrl.IndexOf("?") ); 
                        sb.AppendFormat("ajaxOption.url = '{0}';", url); 
                        var data = "''"
                        if (parameters.Count() > 0
                        { 
                            data = (string.Join(" ", parameters.Select(p => string.Format("'&{0}=' + {0}+", p)).ToArray())); 
                           data= data.TrimEnd('+'); 
                        } 
                        sb.AppendFormat("ajaxOption.data = 'method={1}&rn={4}&{2}={3}'+{0};", data, t.Name, AjaxInvokeParam, AjaxInvokeValue,Guid.NewGuid().ToString()); 

                        sb.Append("ajaxOption= jQuery.extend(window.defaultAjaxOption,ajaxOption);"); 
                        sb.Append("jQuery.ajax(ajaxOption);};"); 
                    }); 
                    jQueryUtilityCache.Current.AddScript(type, sb.ToString()); 
                } 
            } 
            var script = jQueryUtilityCache.Current.GetScript(type); 
            Page.ClientScript.RegisterClientScriptBlock(type.GetType(), type.GetType().FullName + "_" + typeof(jQueryAjaxUtility).FullName + "_AjaxInvoke", script, true); 
        } 

        protected string GenertorScript(Type type) 
        { 

            return string.Empty; 
        } 

        protected static void RegisterAjaxInvokeEvent(Type type) 
        { 

            var Request = System.Web.HttpContext.Current.Request; 
            var Response = System.Web.HttpContext.Current.Response; 
            var method = Request["method"]; 
            if (string.IsNullOrEmpty(method)) 
                return
            Response.Clear(); 
            var methodinfo = type.GetMethod(method, System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); 
            if (methodinfo != null
            { 
                Response.Charset = ResponseCharset; 
                Response.ContentType = string.Join(",", Request.AcceptTypes); 
                var param = methodinfo.GetParameters(); 
                object[] objs = new object[param.Length]; 
                var i = 0
                param.ToList().ForEach(t => 
                { 
                    objs[i++] = Convert.ChangeType(Request[t.Name], t.ParameterType); 
                }); 
                var obj = methodinfo.Invoke(null, objs); 
                if (obj != null
                { 
                    //序列化 
                    if (!obj.GetType().IsValueType && obj.GetType() != typeof(string)) 
                    { 
                        if (Request.AcceptTypes.Contains("text/xml")) 
                        { 
                            Response.Write(Green.Utility.SerializerUtility.XmlSerializer(obj)); 
                        } 
                        else if (Request.AcceptTypes.Contains("application/json")) 
                        { 
                            Response.ContentType = "application/json, text/javascript, */*"
                            Response.Write(Green.Utility.SerializerUtility.JsonSerializer(obj)); 
                        } 
                        else 
                        { 
                            Response.Write(obj); 
                        } 

                    } 
                    else 
                    { 
                        Response.Write(obj); 
                    } 
                } 

                Response.Flush(); 
                Response.Close(); 
                Response.End(); 
            } 
        } 

    } 
}
复制代码

为了考虑反射的性能,加入了类级注册脚本方法缓存处理jQueryUtilityCache,具体见demo。

测试:

html:

<form id="form1" runat="server"> 
    <div> 
        <input id="Button1" type="button" value="button" /> 
    </div> 
    </form>

后台方法注册Page_Load

Green.Utility.jQueryAjaxUtility.RegisterClientAjaxScript(typeof(_Default));

1:

前台:

复制代码
_Default.Test("ajax", 
                             { 
                                 success: function(e) { 
                                     alert(e); 
                                 }, 
                                 dataType: "text" 
                             });
复制代码

后台:

[Green.Utility.jQueryInvokeMethod()] 
   public static string Test(string str) 
   { 
       return "hello:" + str; 
   } 

效果:

image

2:

前台ajax:

复制代码
_Default.TestArrayJson(1, 2, 3, 
              { 
                  success: function(e) {                                  
                      $.each(e, function(i, n) { alert(n); }); 
                  }, 
                  dataType: "json" 
              }) 
复制代码

后台:

复制代码
[Green.Utility.jQueryInvokeMethod()] 
public static int[] TestArrayJson(int p1, int p2, int p3) 

    return new int[] { p1, p2, p3 }; 
}
 
复制代码

效果:

image 

3:

前台ajax:

复制代码
_Default.TestArrayxml("key", "value", 
            { 
                success: function(e) { 
                    alert(e.key); 
                    alert(e.Value); 
                }, 
                dataType: "json" 
            })
复制代码

后台:

[Green.Utility.jQueryInvokeMethod()] 
    public static Test TestArrayxml(string key,string value) 
    { 
        return new Test() { key=key,Value=value}; 
    }

效果:

image

最后看看FireBug中ajax http头信息:

image

 

其他资料jQuery目录:  我jQuery系列之目录汇总

附录:代码下载


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2011/09/26/2192253.html


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
精心挑选的12款优秀 jQuery Ajax 分页插件和教程
  在这篇文章中,我为大家收集了12个基于 jQuery 框架的 Ajax 分页插件,这些插件都提供了详细的使用教程和演示。Ajax 技术的出现使得 Web 项目的用户体验有了极大的提高,如今借助优秀的 jQuery 框架很容易实现各种基于 Ajax 技术实现的功能。
1049 0
分享精心挑选的12款优秀 jQuery Ajax 分页插件和教程
在这篇文章中,我为大家收集了20个基于 jQuery 框架的 Ajax 分页插件,这些插件都提供了详细的使用教程和演示。Ajax 技术的出现使得 Web 项目的用户体验有了极大的提高,如今借助优秀的 jQuery 框架很容易实现各种基于 Ajax 技术实现的功能。
1088 0
jQuery Ajax 简单的实现跨域请求
jQuery Ajax 简单的实现跨域请求
68 0
Jquery .ajax方法分析(二)
访问ws,而web方法再是字符串返回类型。这次通过response来响应请求。所处环境:.net3.5,而webservice 不再添加修饰标签:[System.Web.Script.Services.
618 0
Jquery ajax参数设置
参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址。 type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET"。
625 0
jQuery Ajax 实例 全解析 (转)
1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中。 url (String) : 请求的HTML页的URL地址。 data (Map) : (可选参数) 发送至服务器的 key/value 数据。
912 0
jquery Ajax示例
function ShowMsgText() {     $.ajax({     url:"../datas/jsonTest_1.ashx",        type:"post",     success:function(data){//text,responseText...
726 0
Jquery Ajax WebService
仅供参考 ws.aspx 代码                $.ajax({                    type: "POST",   //访问WebService使用Post方式请求                    contentType: "application/js...
750 0
【BLE MIDI】MIDI 文件格式分析 ( FF 03 轨道名称 | FF 51 03 四分音符时长 )(二)
【BLE MIDI】MIDI 文件格式分析 ( FF 03 轨道名称 | FF 51 03 四分音符时长 )(二)
51 0
1955
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载