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