如果你沒有看我第二天寫的內容的,我想你是看不懂的!!!! 好了,廢話不多說,怎麼才能讓我們的代碼變得牛逼起來呢?怎麼封裝我們的代碼呢?我們不可能 每個頁面都需要那樣寫吧,那我們來一步一步來封裝 我們的代碼,變得更牛逼,維護性更高!!!!! 首先我們來分析,我昨天寫的代碼: 第一步:在界面寫入2個隱藏 ...
如果你沒有看我第二天寫的內容的,我想你是看不懂的!!!!
好了,廢話不多說,怎麼才能讓我們的代碼變得牛逼起來呢?怎麼封裝我們的代碼呢?我們不可能 每個頁面都需要那樣寫吧,那我們來一步一步來封裝 我們的代碼,變得更牛逼,維護性更高!!!!!
首先我們來分析,我昨天寫的代碼:
第一步:在界面寫入2個隱藏控制項,用來存放方法名和參數 (親們,你們不可能每個頁面都去寫吧!!!當然不行,那怎麼辦)
我們是這樣實現的,通過jquery在頁面每次在頁面載入完成後,判斷控制項是否存在,不存在在就寫入,存在就不作任何操作!!
$(function () { if ($("#hid_fangfa").length < 1) // 判斷方法名 的隱藏控制項是否存在,不存在就寫入隱藏控制項 { $("#form1").children().eq(0).after('<input type="hidden" name="hid_fangfa" id="hid_fangfa" />'); } if ($("#hid_canshu").length < 1) {// 判斷參數 的隱藏控制項是否存在,不存在就寫入隱藏控制項
$("#form1").children().eq(0).after('<input type="hidden" name="hid_canshu" id="hid_canshu" />'); } });
第二步:js寫一個方法,只用寫一個參數(方法名),就可以動態拼接多個參數,將動態參數拼接完成放入隱藏控制項中,然後執行表單提交(感覺js沒有學好,好難實現!!!!!)
這裡我們要用到arguments 的 動態參數!!!(這裡除了 方法名字不用拼接之外的其他參數都要拼接 ,我們這用 ‘|’來拼接的)
function gohoutai(fangfa) { var canshu = ''; for (var i = 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 的方式獲取 隱藏控制項的值,然後通過方法名字,參數的個數 去找到該頁面的對應的方法,然後執行這個方法!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection; //需要引用反射
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
public class Base:System.Web.UI.Page { protected override void OnInit(EventArgs e) { if (Page.IsPostBack) { string fangfa = this.Request["hid_fangfa"] == null ? "" : this.Request["hid_fangfa"].ToString(); // 獲取方法名 string canshu = this.Request["hid_canshu"] == null ? "" : this.Request["hid_canshu"].ToString(); //獲取參數
MethodInfo method=null; MethodInfo[] methods=this.GetType().GetMethods(); // 獲取該類中的 所有方法 for (int i = 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,同時後臺需要public partial class test1 : Base ,繼承我們寫的公共類
讓我們我們在前臺動態的調用方法吧!!
前臺 : <input type="button" value="2個參數" onclick="gohoutai('gogo', '我是好人','222');" />
<input type="button" value="1個參數" onclick="gohoutai('gogo','222');" />
後臺 :
public void gogo(string s, string dd)
{
s = "2222";
}
public void gogo(string ss)
{
ss = "2222";
}
然後我們打入斷點 , 希望能夠命中 !!!!!!(成功打入斷點)
至此 我們的 前臺調用後臺的 封裝到此結束,我想你在也沒有見過這麼牛逼的封裝了吧!!代碼的世界太瘋狂了!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
看了我寫的這麼多,你們發現一個東西沒有,好像界面還是刷新了,如果我想 不刷新提交後臺怎麼辦?而且我還想 像 ajax 一樣執行完成後能夠 返回參數,能夠在前臺繼續執行! 我想我們是在顛覆 webform的 寫法吧!!!!!