被解放的阿贾克斯

2023-10-14 10:10
文章标签 解放 阿贾克斯

本文主要是介绍被解放的阿贾克斯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   前一段时间做一个系统功能,页面用到比较多的异步处理---AJAX,所以在后台出现了类似的下面的代码:

View Code
            string action = Request["action"] == null ? "" : Request["action"].Replace("'", "");string a1 = Request["a1"] == null ? "" : Request["a1"].Replace("'", "");string a2 = Request["a2"] == null ? "" : Request["a2"].Replace("'", "");switch(action){case "action1":action1();break;case "action2":action2(a1, a2);break;case "action3":break;case "action4":break;case "action5":break;case "action6":break;default:break;}        

   写着写着,发现代码太长了,看着不顺眼,最近有时间,想了一个办法,可以用到反射的处理方法。

    先说一下思路,大概就是根据ajax的一个参数值(值也就是方法名),来反射调用的方法,这样就可以直接找到方法了,但重要的是还要解决方法的参数传递问题,

这里我采用的是,反射获取方法的参数名,然后根据参数名去查找ajax路径中传递的参数值(ajax中的参数名必需和方法的参数名一样),这样方法的参数问题也就解决了。好了,思路有了就实现吧!let's go!

前端:

View Code
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script><script type="text/javascript">$(function () {$.ajax({url: "WebForm2.aspx?action=action1",data: { r: new Date().getTime() },success: function (msg) {alert(msg);}})$.ajax({url: "WebForm2.aspx?action=action2",data: { a1: "1", a2: "c2", r: new Date().getTime() },success: function (msg) {alert(msg);}})});</script>

后端:

View Code
protected void Page_Load(object sender, EventArgs e){string action = Request["action"] == null ? "" : Request["action"].Replace("'", "");            //获取当前类下的所有方法MethodInfo method = this.GetType().GetMethod(action);//,BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic        if (method != null){ParameterInfo[] par = method.GetParameters();method.Invoke(this, getParameterValue(par));}}public void action1(){Response.Clear();Response.Write("1");Response.End();}public void action2(string a1, string a2){Response.Clear();Response.Write("a1:"+a1+"a2:"+a2);Response.End();}/// <summary>/// 根据参数列表获取url参数值/// </summary>/// <param name="parameter">方法参数列表</param>/// <returns>参数值数组</returns>public object[] getParameterValue(ParameterInfo[] parameter){object[] p = new object[parameter.Length];int i = 0;foreach (ParameterInfo par in parameter){string s = Request[par.Name] == null ? "" : Request[par.Name].Replace("'", "");p[i] = s; //ConvertSimpleType(s, par.ParameterType);转换类型,解决为string类型以外的参数i++;}return p;}

这样就可以不用写switch case ,之前有用过一种webserivce方式,也可以解决掉这个问题,但因为webMethod方法,必需要是静态的公共方法,才能成功被调用,

这样就有一定的局限性了,

不过还是把这种方式贴出来供大家参考下,

前端:

View Code
$(function () {            $.ajax({type: "post",async: false,url: "WebForm3.aspx/action1",data: null,dataType: "json",contentType: "application/json",success: function (msg) {alert(msg.d);}})$.ajax({type: "post",async: false,url: "WebForm3.aspx/action2",data: '{ "a1": "1", "a2": "2" }', //这里一定要写成json字符串形式,否则无效dataType: "json",contentType: "application/json",success: function (msg) {alert(msg.d);}})});

后端:

     [WebMethod]public static string  action1(){return "1";}[WebMethod]public static string action2(string a1,string a2){return "2";}

用这种方式的话,需要注意的是如果项目是3.5框架以下的,需要在webconfig文件中添加如下代码

<!--JQuery ajax调用asp.net的webMethod问题  2.0--><httpModules><add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/></httpModules>

其实这种方式,可以将ajax封装起来调用

View Code
function AjaxMethod(methodName, data, onSuccess, onError) {try {var o = $.extend({}, { onSuccess: onSuccess, onError: onError });$.ajax({type: 'post',async: false,url: $.trim(methodName),data: data,dataType: 'json',contentType: "application/json",success: function (events) {var event = events.d;if (onSuccess) o.onSuccess(event);},error: function (event) { if (onError) o.onError(event); }});} catch (e) {//        $.messager.alert("提示", "在操作的过程中出现了异常!原因:" + e.responseText.Message);
            }}//调用方式AjaxMethod("WebForm3.aspx/action1", null, function (msg) { alert(1); })//这里如果封装的脚本放在引用脚本中,需要注意路径问题,确保脚本能找到页面

大概就这些了,后期还写过解决参数中存在sting类型以外的方法(如参数中有int 类型的),或是重载的方法的解决方案,但感觉没什么必要,因此也就不贴出来了!还得废话一番这种反射的方式肯定没有直接调用方法的执行效率高,不过用于ajax中完成可以忽略。网上有朋友,写了可以高效反射的解决方案。有兴趣的朋友可以去

百度或Google。

PS:不知道这种解决方式有没有什么弊端,也不知道还有没其它什么方式来解决这种类似switch case的问题,有的话望同志们告知分享。

转载于:https://www.cnblogs.com/zhongzhigang/articles/3048311.html

这篇关于被解放的阿贾克斯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/209821

相关文章

解放你的带宽和内存:GZIP在解决Redis大Key方面的应用

首发公众号:赵侠客 引用 目前主流HTTP协议接口都是使用JSON格式做数据交换的,JSON数据格式有着结构简单、可读性高、跨平台,易解析等优点,同时也存在着冗余数据会占用非常多的储存空间的问题,这大大增加了JSON格式数据在存储、传输过程中的性能消耗。所以对JSON格式数据压缩后再传输、存储就变的非常的有价值,如对JSON格式数据使用GZIP压缩算法可以实现90%左右的压缩率,更小的空

证书3月一换很麻烦?一行命令让你解放双手

证书3月一换很麻烦?一行命令让你解放双手 问题 目前证书的大部分有效期都是3个月(免费),对于我们就需要每次在各大运营商平台进行重新申请,替换秘钥,虽然快到期的时候会提醒,但是还是很麻烦。 建议 如果你的nginx配置文件有多个,比如一个二级域名一个配置文件,我建议使用Certbot的手动模式,这样更好自己去管理 Certbot简介 CertbotCertbot 是一个由 Elect

Android系统证书或定制系统解放Https抓包

1.Android系统证书的生成和使用方法 openssl x509 -inform PEM -subject_hash -in BurpCA.pem | head -1cat BurpCA.pem > 9a5ba580.0openssl x509 -inform PEM -text -in BurpCA.pem -out /dev/null >> 9a5ba580.0adb sh

Android解放双手的利器之ViewBinding

文章目录 1. 背景2. ViewBinding是什么3. 开启ViewBinding功能4. 生成绑定类5. 使用ViewBinding5.1Activity 中使用5.2 Fragment 中使用5.3 ViewHolder 中使用 6. ViewBinding的优点7. 与 dataBinding 对比 1. 背景 写代码最繁琐的是什么?重复的机械操作。我们刚接触Andr

【神器来袭】快速解放双手,朋友圈自动转发工具,告别繁琐操作!

朋友圈作为一个重要的营销推广渠道,如果能实现自动转发,那对于很多企业或个人来说,是极好的。下面,就给大家分享一个实用且便捷的朋友圈运营工具——个微管理系统,让大家都能快速推广。 1、多账号登录,定时发圈快人一步 在个微管理系统上,你可以同时登录多个微信号,并且能够同时进行定时发圈的操作。不再需要手动切换账号,让你的推广工作更高效、省时。 2、跟圈设置,自动转发省心又方便 设置完成后,当

让《行列视》解放数据力量,提升业务洞察

在当今信息化浪潮下,数据已经成为企业发展的核心驱动力之一。如何更好地管理和利用数据,已成为企业发展过程中亟需解决的问题之一。而报表工具作为数据可视化和分析的利器,正逐渐受到企业的重视和青睐。 一、《行列视》作为报表工具的重要性 提升数据洞察力:《行列视》作为报表工具能够将海量数据以图表的形式直观展示,帮助企业管理层和业务人员更好地理解数据背后的含义,从而做出更明智的决策。 加快决策速度:传统

解放双手,利用自动点赞软件提高曝光度

在数字时代,社交媒体如同一片繁茂的森林,每一条动态、每一张照片都是树上挂着的果实,而点赞则仿佛是那些吸引眼球的色彩。在这个以流量为王的网络世界里,点赞数往往与内容的可见度直接相关,它不仅能够增加帖子的权重,还能提升发布者的社交地位。然而,手动点赞耗时耗力,且难以满足快速扩张的社交网络需求。于是,自动点赞软件应运而生,成为许多追求高效互动和增强曝光度人士的新宠。 首先,我们必须认识到自动点赞

Baidu Comate智能编码助手 -----AI编程帮你解放双手

目录 Baidu Comate是什么? Baidu Comate如何安装? 在VSCode上安装Baidu Comate插件 Baidu Comate如何使用,有哪些功能? 1.代码解释 2.代码注释 使用感受 如何体验 Baidu Comate是什么? Baidu Comate智能编码助手是百度推出的智能代码编程助手产品,它基于文心大模型的强大理解和推理能

解放右手鼠标,效率实用神器 Autohotkey 利用 Capslock 键匹配 vim 键位| Autohotkey 脚本解决 onenote 上下键问题 | Capslock++

好多年前就用一个祖传 autohotkey 脚本来在所有地方用上 hjkl 来写字,最近因为 onenote uwp 要寿终正寝了,准备用回 office 的版本,结果想起来之前一直用 UWP 是因为 autohotkey 不支持 onenote win32 版本里面的上下键,最近查找了一下解决了这个问题; 这里备注一下防止以后弄丢这个脚本了。 首先是用法(自动热钥匙软件的教程自己百度一下很多

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先(leader)地位。 其LCAP产品是Microsoft Power Apps,扩展了AI Builder、Dataverse、Power Automate和Power Pages,这些都包含在某些Power Apps许可证中。根据Gartner的许多客户互动和Peer