精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

ASP.NET WebForm也可以這樣用Ajax

開發 后端
對于.net提供的ajax控件,暫且不說,只說另外兩種方式,都需要引入額外的代碼文件對Ajax進行操作(asmx和ashx,且web服務還要引入一個cs文件與之對應),假如要對Example.aspx這個頁面添加一些自定義的Ajax操作...

對于asp.net WebForm項目,進行Ajax操作大概有三種方式:web服務(.asmx文件)  ,  一般處理程序(.ashx)和  一些Ajax控件。

對于.net提供的ajax控件,暫且不說,只說另外兩種方式,都需要引入額外的代碼文件對Ajax進行操作(asmx和ashx,且web服務還要引入一個cs文件與之對應),假如要對Example.aspx這個頁面添加一些自定義的Ajax操作,并且這些Ajax操作并不會在別的頁面上用到,如此不得不引入額外的代碼文件完成這個操作,假如這個Ajax操作很簡單,只需要一個簡單的函數就可以執行,那豈不是很麻煩的過程嗎?如此一來,隨著項目中 Ajax操作的增多,ashx和asmx文件都會隨著時間的增長而增長,項目的維護也會隨之加倍。為什么我們不能把Ajax操作的后臺代碼直接放在 Example.aspx對應的Example.aspx.cs文件里 ? 如果能這樣做,以上兩種煩惱都會迎刃而解,不是嗎?

于是,按照以上思路,實現了如下Ajax框架。先來看這個框架的實現機制:

上圖是自己畫的一個縮減版IIS接收到一個aspx請求的HttpApplication管線和asp.net Page在執行ProcessRequest()方法中的頁面生命周期的部分事件。Page本身是繼承自IHttpHandler接口,IHttpHandler提供了一個重要的約束方法ProcessRequest,該方法是對接收到的信息(HttpContext)進行具體的處理同樣,一般處理程序和web服務也實現了自己的IHttpHandler,并以此提供一些Ajax服務。具體的操作過程請自行查找MSDN。

原理是在頁面生命周期開始的第一個事件PreInit進行一些處理,一旦發現劫持到的請求是一個ajax請求,那么利用C#的反射來調用aspx.cs中定義的方法,執行完方法之后,調用Response.End()方法,調用這個方法會直接跳到管線的EndRequest事件,從而結束請求,這樣就無需走一些沒有必要的頁面生命周期的步驟,從而完成一個Ajax操作。如果發現是一個正常的操作,那么就走正常流程。

下面以一個簡單例子說明該Ajax框架的使用:

1. 添加一個解決方案

2. 新建一個 Default.aspx 頁面

3. 在Default.aspx.cs頁面中創建一個被調用的測試方法:

  1. public List<string>  TestAjaxMethod(int a, string b, float c)  
  2.         {  
  3.                return new List<string> { a.ToString(), b, c.ToString() };  
  4.         } 

4.      在Default.aspx中寫一個Ajax請求

  1. PowerAjax.AsyncAjax(‘TestAjaxMethod’, [1, 2, "333","sss"], function (SucceessResponse) {  
  2.         // 成功后的代碼  
  3. }); 

PowerAjax.js是用Jquery專門為這個框架封裝的一個及其簡單的JS類庫,這個類庫中有兩個主要的方法:PowerAjax.AsyncAjax和PowerAjax.SyncAjax,一個提供同步操作,一個提供異步操作,參數有三個:

第一個參數是即將操作在aspx.cs的Ajax方法的名字(用名字反射方法)。

第二個參數是一個以數組形式組成參數列表數據。

第三個參數是操作成功之后執行執行的回調方法,與c#中的委托一個道理。

以下為這個簡單JS庫的代碼:

  1. var PowerAjax = function () { }  
  2. PowerAjax.__Private = function () { }  
  3.    
  4. // 進行異步操作  
  5. PowerAjax.AsyncAjax = function (methodName, paramArray, success) {  
  6.     PowerAjax.__Private.Ajax(methodName, paramArray, success, true);  
  7. }  
  8.    
  9. // 進行的是同步操作  
  10. PowerAjax.SyncAjax = function (methodName, paramArray, success) {  
  11.     PowerAjax.__Private.Ajax(methodName, paramArray, success, false);  
  12. }  
  13.    
  14. PowerAjax.__Private.Ajax = function (methodName, paramArray, success, isAsync) {  
  15.     var data = {};  
  16.     switch (paramArray.length) {  
  17.         case 0:  
  18.             data = { 'isAjaxRequest'true'MethodName': methodName };  
  19.             break;  
  20.         case 1:  
  21.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0] };  
  22.             break;  
  23.         case 2:  
  24.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1] };  
  25.             break;  
  26.         case 3:  
  27.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2] };  
  28.             break;  
  29.         case 4:  
  30.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2], "param3": paramArray[3] };  
  31.             break;  
  32.         case 5:  
  33.             data = { 'isAjaxRequest'true'MethodName': methodName, "param0": paramArray[0], "param1": paramArray[1], "param2": paramArray[2], "param3": paramArray[3], "param4": paramArray[4] };  
  34.             break;  
  35.     }  
  36.    
  37.     var url = document.location.href;  
  38.     $.ajax({  
  39.         type: "post",  
  40.         url: url,  
  41.         data: data,  
  42.         async: isAsync,  
  43.         datatype: "json",  
  44.         contentType: "application/x-www-form-urlencoded; charset=UTF-8",  
  45.         success: function (response) {  
  46.             success(response);  
  47.         },  
  48.         error: function (response) {  
  49.             if (response.status == 500) {  
  50.                 var errorMessage = response.responseText;  
  51.                 var errorTitle = errorMessage.substring(errorMessage.indexOf("<title>") + 7, errorMessage.indexOf("</title>"))  
  52.                 throw new Error("服務器內部錯誤:" + errorTitle);  
  53.             }  
  54.         }  
  55.     });  

5. 更改Default.aspx.cs的繼承頁面為AjaxBasePage              

  1. public partial class _Default : AjaxBasePage 

#p#

6. 主要基類:AjaxBasePage類

如下代碼:

  1. public class AjaxBasePage : System.Web.UI.Page  
  2. {  
  3.     /// <summary>  
  4.     /// 是否是一個ajax請求。  
  5.     /// </summary>  
  6.     public bool IsAjaxRequest { get; private set; }  
  7.  
  8.     /// <summary>  
  9.     ///  如果是Ajax請求,劫持頁面生命周期的PreInit的事件,直接返回Response  
  10.     /// </summary>  
  11.     protected override void OnPreInit(EventArgs e)  
  12.     {  
  13.         AjaxRequest ajaxRequest = AjaxRequest.GetInstance(Request.Form);  
  14.         this.IsAjaxRequest = ajaxRequest.IsAjaxRequest;  
  15.  
  16.         if (this.IsAjaxRequest)  
  17.         {  
  18.             AjaxApplication ajaxApplication = new AjaxApplication(this, ajaxRequest);  
  19.             ajaxApplication.EndRequest();  
  20.         }  
  21.         else 
  22.         {  
  23.             // 如果不是Ajax請求,繼續執行頁面生命周期的剩余事件  
  24.             base.OnPreInit(e);  
  25.         }  
  26.     }  

該類重寫了PreInit方法,判斷請求是否是一個Ajax請求。通過AjaxRequest類接收并處理接收到的請求,提取出一些有效的數據,比如說是否是一個Ajax請求,方法的名字,參數列表(AjaxParameter類)。

至于AjaxParameter類,內部用的數據結構其實是一個字典,并使用索引來提供對數據的方便訪問,提供一個Count屬性,方便獲取參數的個數。     如下代碼

  1. public class AjaxParameter  
  2.     {  
  3.         private IDictionary<int, string> m_DictionaryParamsData = new Dictionary<int, string>();  
  4.    
  5.         /// <summary>  
  6.         /// 返回參數的個數。  
  7.         /// </summary>  
  8.         public int Count  
  9.         {  
  10.             get  
  11.             {  
  12.                 return this.m_DictionaryParamsData.Count;  
  13.             }  
  14.         }  
  15.    
  16.         /// <summary>  
  17.         /// 索引具體參數的值。  
  18.         /// </summary>  
  19.         /// <param name="index"></param>  
  20.         /// <returns></returns>  
  21.         public string this[int index]  
  22.         {  
  23.             get  
  24.             {  
  25.                 if (index >= 5 || index < 0)  
  26.                 {  
  27.                     throw new NotSupportedException("請求方法的參數的個數限制為:0-5");  
  28.                 }  
  29.                 return this.m_DictionaryParamsData[index];  
  30.             }  
  31.         }  
  32.    
  33.         public AjaxParameter(IDictionary<int, string> paramsData)  
  34.         {  
  35.             this.m_DictionaryParamsData = paramsData;  
  36.         }  
  37.     } 

 AjaxRequest類的設計思路其實是模仿HttpContext設計,HttpContext能夠從基礎的http請求報文分析出以后處理將要用到的數據(response,request,session,cookie等等)數據,而AjaxRequest通過分析Ajax的Post請求的數據域 Data分析出各種以后會用到的數據。如下是該類的代碼:

  1. public class AjaxRequest  
  2.     {  
  3.         private Dictionary<int, string> m_DictionaryParamsData = new Dictionary<int, string>();  
  4.         private AjaxParameter m_AjaxParameter;  
  5.         private int m_Count = 0;  
  6.    
  7.         #region 屬性  
  8.         /// <summary>  
  9.         /// 是否是一個Ajax請求。  
  10.         /// </summary>  
  11.         public bool IsAjaxRequest { get; private set; }  
  12.    
  13.         /// <summary>  
  14.         /// 請求的方法名字。  
  15.         /// </summary>  
  16.         public string MethodName { get; private set; }  
  17.    
  18.         /// <summary>  
  19.         /// 參數數據。  
  20.         /// </summary>  
  21.         public AjaxParameter Parameters  
  22.         {  
  23.             get { return this.m_AjaxParameter; }  
  24.         }  
  25.         #endregion  
  26.    
  27.         #region 構造函數  
  28.         private AjaxRequest(NameValueCollection nameValueCollection)  
  29.         {  
  30.             this.IsAjaxRequest = nameValueCollection["isAjaxRequest"] == "true";  
  31.             if (this.IsAjaxRequest)  
  32.             {  
  33.                 this.MethodName = nameValueCollection["MethodName"];  
  34.    
  35.                 foreach (string value in nameValueCollection)  
  36.                 {  
  37.                     string formKey = string.Format("param{0}"this.m_Count);  
  38.                     if (nameValueCollection[formKey] != null)  
  39.                     {  
  40.                         this.m_DictionaryParamsData.Add(this.m_Count, nameValueCollection[formKey]);  
  41.                         this.m_Count++;  
  42.                     }  
  43.                 }  
  44.                 m_AjaxParameter = new AjaxParameter(this.m_DictionaryParamsData);  
  45.             }  
  46.         }  
  47.    
  48.         #endregion  
  49.    
  50.         #region 實例方法  
  51.         public static AjaxRequest GetInstance(NameValueCollection nameValueCollection)  
  52.         {  
  53.             return new AjaxRequest(nameValueCollection);  
  54.         }  
  55.         #endregion  
  56.    
  57.         #region ToString  
  58.         public override string ToString()  
  59.         {  
  60.             return this.MethodName;  
  61.         }  
  62.         #endregion  
  63.     } 

通過分析AjaxRequest的屬性IsAjaxRequest可判斷是否為Ajax請求,若該請求為一個Ajax請求,那么創建一個AjaxApplication實例,在創建AjaxApplication實例的過程中會利用當前頁面和AjaxRequest提供的數據進行實際方法的調用(反射),該類是執行Ajax方法的核心類,其中會判斷是否讀取的到的方法是一個有效的方法,并判斷從JS中AjaxApplication傳入的參數類型的有效性,目前只提供對以下13中參數提供支持,如下:

  1. (String、Boolean、Int32、Int64、UInt32、UInt64、Single、Double、Decimal、DateTime、DateTimeOffset、TimeSpan、Guid) 

如果方法中出現非以上類型,將會拋出異常。為了方便Ajax的調試,在JS前段類庫中我會對異常進行處理,并拋出Error,Error信息有效的截取了繼承自Exception的拋出信息,至于如何獲    得更加詳細的JS調試信息,以后JS庫中可能會做提供更加詳細的調用信息,畢竟框架是在改進中進行的。如下是AjaxApplication類的具體代碼:

  1. public class AjaxApplication  
  2.     {  
  3.         private AjaxBasePage m_AjaxBasePage;  
  4.         private object m_ResponseData;  
  5.    
  6.         public AjaxApplication(AjaxBasePage ajaxBasePage, AjaxRequest ajaxRequest)  
  7.         {  
  8.             this.m_AjaxBasePage = ajaxBasePage;  
  9.             Type ajaxBasePageType = ajaxBasePage.GetType();  
  10.             MethodInfo methodInfo = ajaxBasePageType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)  
  11.                                         .FirstOrDefault(item => item.Name == ajaxRequest.MethodName);  
  12.             object[] parameterData = this.GetParameterData(ajaxRequest, methodInfo);  
  13.    
  14.             if (methodInfo.IsStatic)  
  15.             {  
  16.                 this.m_ResponseData = methodInfo.Invoke(null, parameterData);  
  17.             }  
  18.             else 
  19.             {  
  20.                 this.m_ResponseData = methodInfo.Invoke(ajaxBasePage, parameterData);  
  21.             }  
  22.         }  
  23.    
  24.         /// <summary>  
  25.         /// 獲取參數數據。  
  26.         /// </summary>  
  27.         private object[] GetParameterData(AjaxRequest ajaxRequest, MethodInfo methodInfo)  
  28.         {  
  29.             if (methodInfo != null)  
  30.             {  
  31.                 ParameterInfo[] parameterInfos = methodInfo.GetParameters();  
  32.    
  33.                 if (parameterInfos.Length > 5)  
  34.                 {  
  35.                     throw new NotSupportedException("最多支持5個參數");  
  36.                 }  
  37.    
  38.                 if (parameterInfos.Length > ajaxRequest.Parameters.Count)  
  39.                 {  
  40.                     throw new ArgumentException("缺少參數!");  
  41.                 }  
  42.    
  43.                 List<object> parameterData = new List<object>(parameterInfos.Length);  
  44.                 for (int i = 0; i < parameterInfos.Length; i++)  
  45.                 {  
  46.                     ParameterInfo parameterInfo = parameterInfos[i];  
  47.                     string paramValue = ajaxRequest.Parameters[i];  
  48.    
  49.                     try 
  50.                     {  
  51.                         parameterData.Add(ParseAjaxParameter(paramValue, parameterInfo));  
  52.                     }  
  53.                     catch (FormatException)  
  54.                     {  
  55.                         string format = string.Format("傳入靜態方法 {0} 的第 {1} 個(從0開始計數)參數類型不匹配,應該為 {2} 類型 請檢查!", methodInfo.Name, i, parameterInfo.ParameterType.Name);  
  56.                         throw new FormatException(format);  
  57.                     }  
  58.                 }  
  59.                 return parameterData.ToArray();  
  60.             }  
  61.             else 
  62.             {  
  63.                 throw new InvalidOperationException("沒有發現此方法,請檢查該方法簽名(方法必須為public)");  
  64.             }  
  65.         }  
  66.    
  67.         /// <summary>  
  68.         /// 類型轉換。支持 String、Boolean、Int32、Int64、UInt32、UInt64、Single、Double、Decimal、DateTime、DateTimeOffset、TimeSpan、Guid  
  69.         /// </summary>  
  70.         private object ParseAjaxParameter(string ajaxParameterValue, ParameterInfo parameterInfo)  
  71.         {  
  72.             object obj;  
  73.             if (parameterInfo.ParameterType == typeof(String))  
  74.             {  
  75.                 obj = ajaxParameterValue;  
  76.             }  
  77.             else if (parameterInfo.ParameterType == typeof(Boolean))  
  78.             {  
  79.                 obj = bool.Parse(ajaxParameterValue);  
  80.             }  
  81.             else if (parameterInfo.ParameterType == typeof(Int32))  
  82.             {  
  83.                 obj = Int32.Parse(ajaxParameterValue);  
  84.             }  
  85.             else if (parameterInfo.ParameterType == typeof(UInt32))  
  86.             {  
  87.                 obj = UInt32.Parse(ajaxParameterValue);  
  88.             }  
  89.             else if (parameterInfo.ParameterType == typeof(UInt64))  
  90.             {  
  91.                 obj = UInt64.Parse(ajaxParameterValue);  
  92.             }  
  93.             else if (parameterInfo.ParameterType == typeof(Single))  
  94.             {  
  95.                 obj = Single.Parse(ajaxParameterValue);  
  96.             }  
  97.             else if (parameterInfo.ParameterType == typeof(Double))  
  98.             {  
  99.                 obj = Double.Parse(ajaxParameterValue);  
  100.             }  
  101.             else if (parameterInfo.ParameterType == typeof(Decimal))  
  102.             {  
  103.                 obj = Decimal.Parse(ajaxParameterValue);  
  104.             }  
  105.             else if (parameterInfo.ParameterType == typeof(DateTime))  
  106.             {  
  107.                 obj = DateTime.Parse(ajaxParameterValue);  
  108.             }  
  109.             else if (parameterInfo.ParameterType == typeof(DateTimeOffset))  
  110.             {  
  111.                 obj = DateTimeOffset.Parse(ajaxParameterValue);  
  112.             }  
  113.             else if (parameterInfo.ParameterType == typeof(TimeSpan))  
  114.             {  
  115.                 obj = TimeSpan.Parse(ajaxParameterValue);  
  116.             }  
  117.             else if (parameterInfo.ParameterType == typeof(Guid))  
  118.             {  
  119.                 obj = Guid.Parse(ajaxParameterValue);  
  120.             }  
  121.             else 
  122.             {  
  123.                 throw new NotSupportedException("方法參數類型不支持!");  
  124.             }  
  125.             return obj;  
  126.         }  
  127.    
  128.         /// <summary>  
  129.         /// 結束頁面生命周期,同時直接執行應用程序生命周期的EndRequest事件。  
  130.         /// </summary>  
  131.         public void EndRequest()  
  132.         {  
  133.             HttpResponse response = this.m_AjaxBasePage.Page.Response;  
  134.             response.ContentType = "application/json";  
  135.             response.Clear();  
  136.             JavaScriptSerializer jsonSerializer2 = new JavaScriptSerializer();  
  137.             response.Write(jsonSerializer2.Serialize(new JsonResponse { IsSuccess = true, Message = "處理成功", ResponseData = this.m_ResponseData }));  
  138.             response.End();  
  139.         }  
  140.     } 

 當初始化了一個AjaxApplication實例后, 可以調用該實例的EndRequest()方法,來結束Ajax請求。該方法內部最后調用Response.End()方法來結束頁面生命周期和大部分管線事件。

并用JsonResponse類來封裝返回數據。

  1. public class JsonResponse  
  2. {  
  3.     public bool IsSuccess { get; set; }  
  4.     public string Message { get; set; }  
  5.     public object ResponseData { get; set; }  

該類最后一個參數即承載了調用方法的返回值,為一個Object類型,也就是說,框架可以支持任何類型的返回值,當然該類型可以被序列化。

7. 回過頭來再看Ajax請求,針對返回值可以這樣用:

  1. PowerAjax.AsyncAjax('TestAjaxMethod', [1, 2, "333""sss"], function (SucceessResponse) {  
  2.     if (SucceessResponse.IsSuceess) {  
  3.         alert("恭喜,該ajax方法調用成功!");  
  4.         Process(SucceessResponse.ResponseData); // 處理返回的數據,這里可能需要你自己實現了,因為我無法判斷你要返回的是什么東西,這是個Object  
  5.     } else {  
  6.         alert("這是操作錯誤奧,不是內部異常,內部異常的拋出會我內部會處理的!");  
  7.         alert("錯誤信息:" + SucceessResponse.Message);  
  8.     }  
  9. });  

以上是試水的東西,希望各位大牛指正。

原文鏈接:http://www.cnblogs.com/A_ming/archive/2013/03/28/2986949.html

責任編輯:張偉 來源: 博客園
相關推薦

2009-07-22 16:05:34

ASP.NET AJA

2009-07-22 16:25:41

ASP.NET AJA

2009-07-22 16:11:43

ASP.NET AJA

2009-07-24 13:41:15

ASP.NET AJA

2009-07-22 16:17:39

ASP.NET AJA

2009-08-24 09:18:34

ASP.NET MVC

2009-12-30 14:28:09

ASP.NET Web

2009-12-08 08:57:21

ASP.NET MVC

2009-07-20 10:16:13

配置ASP.NET A

2009-07-29 13:50:26

UpdatePanelASP.NET

2009-07-22 15:58:52

ASP.NET AJA

2009-07-31 13:24:43

ASP.NET AJA

2009-07-28 09:02:32

asp.net aja

2009-07-20 13:54:31

ScriptManagASP.NET AJA

2009-07-20 17:39:36

WCF服務ASP.NET AJA

2009-08-07 16:09:25

ASP.NET AJA

2009-07-29 15:53:22

ASP.NET AJA

2009-07-21 17:18:26

UpdateProgrASP.NET AJA

2009-07-20 13:14:25

安裝ASP.NET A

2013-08-22 10:28:50

.NET MVC.NETRazor
點贊
收藏

51CTO技術棧公眾號

无码视频在线观看| 在线xxxxx| 快射视频在线观看| 国产成人免费视频精品含羞草妖精| 色综合天天狠天天透天天伊人| 婷婷五月精品中文字幕| av成人在线看| 亚洲福利一区二区| 五月天久久综合网| 欧美77777| 九一九一国产精品| 97视频在线播放| 很污很黄的网站| 欧美巨大xxxx| 四虎视频在线精品免费网址| 成人影院在线看| 国产高清一区日本| 奇米影视亚洲狠狠色| 久久爱一区二区| 国产精品极品| 欧美色图免费看| 免费看欧美黑人毛片| 国产在线观看黄| 国产91精品在线观看| 国产精品69av| 亚洲国产精品成人无久久精品| 欧美在线电影| 国产丝袜精品视频| 中文字幕1区2区| 国产精品原创视频| 精品日韩中文字幕| 国产成人在线小视频| 一级做a爰片毛片| 99er精品视频| 欧美在线播放高清精品| 99视频在线免费播放| 肉肉视频在线观看| 最新久久zyz资源站| 视频在线精品一区| 国产在线观看黄| 国产亚洲一区字幕| 久久久久久久久久久一区| 亚洲AV无码国产精品午夜字幕 | 狠狠狠色丁香婷婷综合激情| 日韩女优在线播放| 中文字幕亚洲精品在线| 亚洲夜间福利| 久久久久久国产精品三级玉女聊斋 | 中文永久免费观看| 日韩在线一二三区| 日韩免费观看网站| 国产午夜无码视频在线观看| 久久一本综合频道| 欧美最猛性xxxxx免费| 日韩成人免费在线观看| 亚洲黄色在线| 69精品小视频| 日韩网红少妇无码视频香港| 91久久亚洲| 91精品国产乱码久久久久久久久 | 国产精品美女久久久| 久久男人资源视频| 国产无码精品在线播放| 亚洲激情视频| 欧美在线观看日本一区| 亚洲欧美综合自拍| 日韩高清在线电影| 国产一区深夜福利| 国产熟女精品视频| 成人美女视频在线观看18| 国产一区喷水| 国产在线观看网站| 亚洲天堂免费看| 91亚洲精品国产| av最新在线| 色综合天天在线| 美女网站色免费| 久久久久久久久久久久电影| 精品福利一二区| 丝袜美腿中文字幕| 欧美疯狂party性派对| 日韩视频免费在线| 国产在线一区视频| 玖玖在线精品| 亚洲综合日韩在线| 亚洲av成人精品毛片| 欧美国产精品一区二区| 超碰10000| 亚洲黄色免费看| 欧美中文一区二区三区| 久久发布国产伦子伦精品| 久久午夜影院| 久久精品91久久久久久再现| 久久久久久久久久久网 | www.五月天色| 日韩大尺度在线观看| 中文字幕亚洲专区| 日产电影一区二区三区| 男女男精品网站| 国产区二精品视| 91精品大全| 亚洲成人免费在线| 一级做a免费视频| 午夜先锋成人动漫在线| 久久色在线播放| 国产www在线| 国产精品亚洲а∨天堂免在线| 老司机精品福利在线观看| 超碰最新在线| 欧美图片一区二区三区| 亚洲の无码国产の无码步美| 欧美电影免费| 国产97免费视| 女人18毛片水真多18精品| 亚洲色图制服诱惑| 四季av一区二区| 久久99精品久久久久久欧洲站| 日韩在线资源网| 亚洲天堂视频网站| 丁香婷婷深情五月亚洲| 宅男av一区二区三区| 不卡福利视频| 精品国产乱码久久久久久老虎| 黑人と日本人の交わりビデオ| 国产欧美一区二区色老头| 91观看网站| 里番在线观看网站| 欧美色视频在线| www.av天天| 国产精品腿扒开做爽爽爽挤奶网站| 91精品视频专区| sese在线视频| 在线视频欧美区| 亚洲第一页av| 国产精品日韩精品欧美精品| 精品免费一区二区三区蜜桃| 国产蜜臀一区二区打屁股调教| 欧美精品国产精品| 亚洲国产精品一区二区久久hs| 青青草国产精品97视觉盛宴| 日本一区二区三区www| 最新日韩精品| 亚洲免费精彩视频| 国产超碰人人爽人人做人人爱| 成人网男人的天堂| 97视频在线免费| 成人线上播放| 97国产精品视频| 天堂中文在线看| 精品久久久久久久中文字幕| 中国一级特黄录像播放| av成人天堂| 久久99精品久久久久久久青青日本 | 久久久久久久久久久网站| 亚洲男女视频在线观看| 亚洲一区二区三区四区五区中文| 日韩大尺度视频| 亚洲激情社区| 青青成人在线| 精品亚洲a∨| 久久成人精品一区二区三区| 亚洲AV无码一区二区三区性 | 黄色av网站免费观看| 久久精品人人做人人综合 | 国产精品一级在线| 国内精品国产三级国产99| 一区二区三区四区高清视频| 久久久久久久香蕉网| 日韩精品123| 欧洲生活片亚洲生活在线观看| 一级片黄色录像| 国产一区二区久久| 日韩极品视频在线观看| 天天躁日日躁狠狠躁欧美| 97超级碰在线看视频免费在线看| 精品人妻一区二区三区含羞草 | 欧美国产精品劲爆| 波多野结衣电影免费观看| 亚洲理伦在线| 日韩欧美视频一区二区三区四区| 91成人小视频| 国内精品久久久久久久| 狠狠色伊人亚洲综合网站l| 欧美美女一区二区三区| 久一视频在线观看| 国产午夜精品在线观看| 一级黄色高清视频| 日韩一级精品| 亚洲制服中文| 精品一区二区男人吃奶| 国产精品久久久久免费a∨| 亚洲男同gay网站| 亚洲人成网7777777国产| av中文在线观看| 色国产精品一区在线观看| 成年人二级毛片| 久久综合九色综合久久久精品综合 | 性xxxxfreexxxxx欧美丶| 中文字幕一区二区精品| 国产91免费看| 欧美日韩久久不卡| 免费观看一区二区三区毛片 | 欧美aaa在线观看| 欧美综合精品| 2014国产精品| 99热播精品免费| 国模吧一区二区三区| 色综合久久影院| 精品日韩一区二区三区| 欧美另类高清videos的特点| 亚洲国产精品久久一线不卡| 无码人妻精品中文字幕| 久久久久成人黄色影片| 日本一区二区免费视频| 极品少妇一区二区| 欧美两根一起进3p做受视频| 一区二区精品| 青草网在线观看| 香港欧美日韩三级黄色一级电影网站| 欧美美乳视频网站在线观看| av动漫精品一区二区| 91老司机在线| 精品三级在线| 国产精品国产三级国产aⅴ浪潮| 日本在线啊啊| 91精品国产99久久久久久| 高清电影在线观看免费| 久久福利网址导航| 自拍视频在线网| 永久免费毛片在线播放不卡| 久久这里精品| 中文字幕一区二区三区乱码在线| 51调教丨国产调教视频| 成人做爰69片免费看网站| 自拍一级黄色片| 免费精品视频在线| 一道本视频在线观看| 日韩中文字幕区一区有砖一区| 欧美色图另类小说| 亚洲欧美久久久| 免费无码国产v片在线观看| 9国产精品视频| 国产精品免费入口| 午夜亚洲福利在线老司机| 男女高潮又爽又黄又无遮挡| 国产视频亚洲| 日本三级免费观看| 天堂va蜜桃一区二区三区漫画版| 日本日本19xxxⅹhd乱影响| 一区二区福利| 成人免费毛片播放| 奇米影视一区二区三区小说| www午夜视频| 国模大尺度一区二区三区| 亚欧精品在线视频| 高清国产一区二区三区| 99re这里只有| 久久这里只有精品首页| 精品人妻互换一区二区三区| 欧美国产综合一区二区| 国产小视频你懂的| 亚洲精品国产一区二区三区四区在线 | 国模视频一区二区| 欧美少妇网站| 国产成人精品一区| 亚洲成人高清| www.久久久| 婷婷亚洲成人| 亚洲视频精品一区| 欧美激情1区2区3区| 霍思燕三级露全乳照| 久久aⅴ乱码一区二区三区| 一级黄色香蕉视频| 九一久久久久久| 99热超碰在线| 国产欧美日产一区| 农村妇女精品一区二区| 精品久久久国产| 中文字幕欧美在线观看| 欧美一级理论性理论a| 性感美女福利视频| x99av成人免费| 草草在线视频| 国产欧美精品va在线观看| 91欧美极品| 日韩久久在线| 国产精品vip| 精品久久久久久无码国产| 国产一区二区三区四区五区入口 | 亚洲日本欧美天堂| 日本中文字幕免费| 欧美理论电影在线| 污视频软件在线观看| 色综合伊人色综合网| 国产99在线| 91亚洲精品久久久久久久久久久久| 国产伦理久久久久久妇女 | 亚洲专区欧美专区| 看看黄色一级片| 99re这里只有精品首页| 美国黄色片视频| 欧美视频中文在线看| 国产偷拍一区二区| 夜夜躁日日躁狠狠久久88av | 五月天久久777| 精品国产一二三四区| 国内精品久久久久影院色| 丰满圆润老女人hd| 亚洲最大成人综合| 国产又粗又猛又黄| 亚洲乱码国产乱码精品精天堂 | 欧美专区中文字幕| 日韩精品一级| 亚洲国产精品123| 国产精品久久久亚洲一区| 亚洲911精品成人18网站| 国产精品情趣视频| 狠狠狠狠狠狠狠| 亚洲国产精品va在线观看黑人| 麻豆视频在线观看免费网站| 国产成人精品一区二区| 加勒比久久高清| 日韩在线视频在线| 国产一区二区三区综合| 自拍偷拍第9页| 欧美亚洲综合在线| 久久久久久久影视| 欧美一级视频在线观看| 成人看片爽爽爽| 337p亚洲精品色噜噜狠狠p| 精品一区二区三区av| 免费黄色在线网址| 91久久精品一区二区| 久久久久久久影视| 欧亚精品在线观看| 伊甸园亚洲一区| 国产日产欧美视频| 91视频91自| 精品成人免费视频| 亚洲国内高清视频| 成年女人在线看片| 国产伦精品一区二区三区四区视频| 综合久久十次| 亚洲欧美日韩中文字幕在线观看| 亚洲免费av网站| 精品国产亚洲av麻豆| 欧美成人在线网站| 中文字幕亚洲在线观看 | 自拍偷拍第9页| 8v天堂国产在线一区二区| 黄色成年人视频在线观看| 91精品视频在线看| 亚洲欧美一级二级三级| 欧美性生交xxxxx| 午夜欧美一区二区三区在线播放| 日本毛片在线观看| 7m第一福利500精品视频| 天堂在线精品| 邪恶网站在线观看| 亚洲男人的天堂网| 黄色美女一级片| 欧美亚洲国产视频小说| 精品国产中文字幕第一页| 国产精品久久a| 亚洲乱码国产乱码精品精可以看| 国产福利第一视频| 97国产精品视频| 成人精品天堂一区二区三区| 欧美一级xxxx| 性感美女极品91精品| 欧美在线观看在线观看| 国产精品美女主播在线观看纯欲| 久久精品国产大片免费观看| 黄色三级视频在线播放| 精品久久久一区二区| 国产黄在线播放| 91久久伊人青青碰碰婷婷| 一区二区动漫| 很污很黄的网站| 亚洲精品大尺度| 欧美综合影院| 秋霞无码一区二区| 国产精品伦一区二区三级视频| 亚洲黄色小说网| 国产成人福利视频| 欧美二区不卡| 青青草福利视频| 欧美一区二区三区四区久久| 激情国产在线| 香蕉精品视频在线| 91久色porny| 国产精品国产av| 欧美怡红院视频一区二区三区| 欧美gayvideo| 蜜桃精品成人影片| 日韩视频免费直播| 免费污视频在线一区| 国产一线二线三线女| 国产精品国产三级国产| 无码精品人妻一区二区|