通過之前的介紹,我們知道要執行頁面對象的方法,核心就是反射,是從請求獲取參數并執行指定方法的過程。實際上這和asp.net mvc框架的核心思想很類似,它會解析url,從中獲取controller和action名稱,然后激活controller對象,從請求獲取action參數并執action。在web form平臺上,我們把方法寫在.aspx.cs中,要實現的就是在頁面對象還未生成的情況下,執行指定的方法,然后返回結果。
我們先看實現后幾個調用例子,這些功能也可以組合使用:
[AjaxMethod] public void Test1(int index) { //簡單調用 } [AjaxMethod] public string Test2(Test test) { return "參數為一個Test實例"; } [AjaxMethod(OutputCache = 20)] public string Test3(int index) { return "輸出結果緩存20秒"; } [AjaxMethod(ServerCache = 20)] public string Test4() { return "在服務端緩存20秒"; } [AjaxMethod(SessionState=SessionState.None)] public void Test5() { //Session未被加載 } [AjaxMethod(SessionState = SessionState.ReadOnly)] public void Test6() { //Session只能讀不能寫 } [AjaxMethod(SessionState = SessionState.ReadWrite)] public void Test7() { //Session可以讀寫 } [AjaxMethod(IsAsync = true)] public void Test8() { //異步調用 }
前面我們已經熟悉基本的執行流程,現在直接進入主題。
Ajax約定
通?,F在主流瀏覽器在使用ajax發送異步請求時,請求頭都會帶上一個:X-Requested-With:XMLHttpRequest 的標記。我們也可以直接通過這個標記來判斷是不是ajax請求,不過項目中可能有用其它的組件,為了不相互影響,我們加入一個自定義的請求頭。這里為:
internal static class AjaxConfig { /// <summary> /// 請求頭Ajax標記鍵 /// </summary> public const string Key = "AjaxFlag"; /// <summary> /// 請求頭Ajax標記值 /// </summary> public const string Value = "XHR"; /// <summary> /// 請求頭Ajax方法標記 /// </summary> public const string MethodName = ""; }
意思是如果http 的請求頭包含一個 AjaxFlag : XHR,就是我們要處理的。另外http header的MethodName就表示我們要執行的方法的名稱。
AjaxMethodAttribute標記屬性
標記屬性是給反射用的,在這里定義我們需要的一些功能。我們希望有:
1. 可以配置Session狀態
2. 支持異步Handler
3. 支持Get緩存
4. 支持服務端緩存
定義如下,用AttributeUsag標記該標記只能用于方法上。
/// <summary> /// ajax方法標記屬性 /// </summary> [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public class AjaxMethodAttribute : Attribute { public AjaxMethodAttribute() { } private SessionState _sessionState = SessionState.None; private int _outputCache = 0; private int _serverCache = 0; private ContentType _contentType = ContentType.Plain; private bool _isUseAsync = false; /// <summary> /// session狀態 /// </summary> public SessionState SessionState { get { return _sessionState; } set { _sessionState = value; } } /// <summary> /// 客戶端緩存時間,以秒為單位。該標記只對get請求有效 /// </summary> public int OutputCache { get { return _outputCache; } set { _outputCache = value; } } /// <summary> /// 服務端緩存時間,以秒為單位 /// </summary> public int ServerCache { get { return _serverCache; } set { _serverCache = value; } } /// <summary> /// 輸出類型(默認為text/plain) /// </summary> public ContentType ContentType { get { return _contentType; } set { _contentType = value; } } /// <summary> /// 使用啟用異步處理 /// </summary> public bool IsAsync { get { return _isUseAsync; } set { _isUseAsync = value; } } } /// <summary> /// Session狀態 /// </summary> public enum SessionState { None, ReadOnly, ReadWrite } /// <summary> /// 輸出內容類型 /// </summary> public enum ContentType { Plain, Html, XML, Javascript, JSON }
新聞熱點
疑難解答
圖片精選