前言
上一篇介紹了在webform平臺實現ajax的一些方式,并且實現一個基類。這一篇我們來看一個開源的組件:ajaxpro。雖然這是一個比較老的組件,不過實現思想和源碼還是值得我們學習的。通過上一篇的介紹,我們知道要調用頁面對象的方法,就是靠反射來實現的,關鍵是整個處理過程,包括反射調用方法、參數映射等。ajaxpro不僅在后臺幫我們實現了這個過程,在前臺也封裝了請求調用的方法,例如ajax的相關方法,用ajaxpro的方法就可以發送異步請求了,不需要自己封裝js或者使用js庫。接下來就對這個組件進行淺析。
一、ajaxpro的使用
我們先來看這個組件如何使用。
1. 注冊AjaxHandlerFactory
在web.config里進行如下配置:
<httpHandlers> <add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro"/></httpHandlers>
簡單的說,請求的url符合 ajaxpro/*.ashx 格式的,都會被AjaxHandlerFactory處理,這是一個實現IHandlerFactory接口的工廠類,用來獲取IHandler處理程序。其中type的格式是:"名稱控件.類名稱,程序集名稱"。
2. 在頁面類Page_Load事件進行注冊
protected void Page_Load(object sender, EventArgs e){ AjaxPro.Utility.RegisterTypeForAjax(typeof(AjaxProPage));}
我們傳遞了本頁面對象的Type給ResisterTypoForAjax方法,這個方法用來在前臺注冊腳本,具體會調用當前Page對象的RegisterClientScriptBlock進行注冊,所以.aspx文件中必須有一個<form runat="server"></form>,否則腳本將無法注冊。(這里傳遞了Type,實際也可以做到不用傳遞的,內部通過HttpContext.Current.Handler.GetType().BaseType 也可以獲得這個類型)
3.用AjaxMethod標記方法
[AjaxMethod]public List<string> GetList(string input1,string input2){ return new List<string> { input1, input2 };}
AjaxMethod是一個標記屬性,表示這個方法用于處理ajax請求,它最終通過反射執行;它有幾個構造函數對,對于有些需要緩存的數據,可以設置緩存時間;如果我們的請求不需要使用Session,可以設置HttpSessionStateRequirement;如果請求需要異步,例如請求一個耗時的web服務,也可以設置處理程序為異步狀態。
方法的返回值可以是簡單的類型,也可以是復雜的類型;例如集合類型在前臺獲得就是一個數組。
4.前臺調用
后臺的配置和使用都非常簡單,接下來我們看前臺如何發起請求。
function GetList() { //var result = AjaxProNamespace.AjaxProPage.GetList("a", "b").value; //console.log(result); AjaxProNamespace.AjaxProPage.GetList("a", "b", function (result) { console.log(result); }); }
新聞熱點
疑難解答
圖片精選