国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > AJAX > 正文

編寫輕量ajax組件第三篇實現

2024-09-01 08:28:03
字體:
來源:轉載
供稿:網友

通過之前的介紹,我們知道要執行頁面對象的方法,核心就是反射,是從請求獲取參數并執行指定方法的過程。實際上這和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約定

  通常現在主流瀏覽器在使用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  }            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云和县| 陵水| 洛南县| 玉龙| 富源县| 开平市| 色达县| 井研县| 沂南县| 隆德县| 秭归县| 临城县| 定安县| 安龙县| 东阿县| 如皋市| 曲阜市| 崇州市| 乐昌市| 宿松县| 会泽县| 泗洪县| 沙雅县| 江阴市| 丰原市| 河南省| 蒙山县| 睢宁县| 潜江市| 黄大仙区| 龙岩市| 邵阳市| 衡阳市| 罗源县| 淮安市| 平乐县| 正镶白旗| 玛沁县| 东明县| 兴仁县| 宁强县|