您的位置:首页 > Web前端 > JavaScript

打造颠覆你想象中的高性能,轻量级的webform框架---js直接调后台的封装(第三天)

2017-07-29 17:56 309 查看
如果你没有看我第二天写的内容的,我想你是看不懂的!!!!

好了,废话不多说,怎么才能让我们的代码变得牛逼起来呢?怎么封装我们的代码呢?我们不可能每个页面都需要那样写吧,那我们来一步一步来封装我们的代码,变得更牛逼,维护性更高!!!!!

首先我们来分析,我昨天写的代码:

第一步:在界面写入2个隐藏控件,用来存放方法名和参数(亲们,你们不可能每个页面都去写吧!!!当然不行,那怎么办)

我们是这样实现的,通过jquery在页面每次在页面加载完成后,判断控件是否存在,不存在在就写入,存在就不作任何操作!!

$(function(){ if($("#hid_fangfa").length<1)//判断方法名的隐藏控件是否存在,不存在就写入隐藏控件 { $("#form1").children().eq(0).after('<inputtype="hidden"name="hid_fangfa"id="hid_fangfa"/>'); } if($("#hid_canshu").length<1){//判断参数的隐藏控件是否存在,不存在就写入隐藏控件
$("#form1").children().eq(0).after('<inputtype="hidden"name="hid_canshu"id="hid_canshu"/>');}});

 第二步:js写一个方法,只用写一个参数(方法名),就可以动态拼接多个参数,将动态参数拼接完成放入隐藏控件中,然后执行表单提交(感觉js没有学好,好难实现!!!!!)

这里我们要用到arguments的动态参数!!!(这里除了方法名字不用拼接之外的其他参数都要拼接,我们这用‘|’来拼接的)

functiongohoutai(fangfa){ varcanshu=''; for(vari=0;i<arguments.length;i++){//获取所有的参数,除了方法名之外全部需要拼接 if(typeof(arguments[i])=='object')//拼接对象只支持string和number { continue; } if(i!=0&&i==1) { canshu=canshu+arguments[i].toString(); } if(i>1) { canshu=canshu+"|"+arguments[i].toString(); } } $("#hid_fangfa").val(fangfa);//在隐藏控件中存入方法名 $("#hid_canshu").val(canshu);//在隐藏控件中存入拼接后的参数
$("#form1").attr("target","_self");//这里表示指向的form1默认提交的页面 $("#form1").submit();//提交表单 } 

第三步:后台通过隐藏控件中的方法名字不同去执行不同的方法(难道一定要循环判断隐藏控件的值才能执行不同的方法吗?难道要使用传说的反射!!!!)

亲们,你们说对了,这里唯有反射才能实现前台动态的调用后台的不同的方法。 

后台的代码需要能够通过js动态的调用前台的方法,就必须要继承一个类,这个类叫父类,我们这里建了一个类叫Base,还需要继承System.Web.UI.Page,

首先我们通过Request的方式获取隐藏控件的值,然后通过方法名字,参数的个数去找到该页面的对应的方法,然后执行这个方法!


usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Reflection;//需要引用反射
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.HtmlControls;
usingSystem.Web.UI.WebControls;

publicclassBase:System.Web.UI.Page
{
protectedoverridevoidOnInit(EventArgse)
{
if(Page.IsPostBack)
{
stringfangfa=this.Request["hid_fangfa"]==null?"":this.Request["hid_fangfa"].ToString();//获取方法名
stringcanshu=this.Request["hid_canshu"]==null?"":this.Request["hid_canshu"].ToString();//获取参数

MethodInfomethod=null;
MethodInfo[]methods=this.GetType().GetMethods();//获取该类中的所有方法
for(inti=0;i<methods.Length;i++)//遍历所有方法,找到方法名字相同,并且参数个数也相同的方法
{
if(methods[i].Name==fangfa&&methods[i].GetParameters().Length==canshu.Split('|').Length)
{
method=methods[i];
break;
}
}
if(method!=null)//判断是否找到方法
{
string[]strs=canshu.Split('|');//获取参数分割后的数组
method.Invoke(this,strs);//执行方法
}
}
}
}


第四步:首先要引入我们刚才写的js,同时后台需要publicpartialclasstest1:Base,继承我们写的公共类

让我们我们在前台动态的调用方法吧!!

前台:<inputtype="button"value="2个参数"onclick="gohoutai('gogo','我是好人','222');"/>

<inputtype="button"value="1个参数"onclick="gohoutai('gogo','222');"/>

后台:

publicvoidgogo(strings,stringdd)
{
s="2222";
}

publicvoidgogo(stringss)
{
ss="2222";
}

然后我们打入断点,希望能够命中!!!!!!(成功打入断点)

至此我们的前台调用后台的封装到此结束,我想你在也没有见过这么牛逼的封装了吧!!代码的世界太疯狂了!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

看了我写的这么多,你们发现一个东西没有,好像界面还是刷新了,如果我想不刷新提交后台怎么办?而且我还想像ajax一样执行完成后能够返回参数,能够在前台继续执行!我想我们是在颠覆webform的写法吧!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐