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

淺談ASP.NET MVC中TempData的實(shí)現(xiàn)機(jī)制

開(kāi)發(fā) 后端
在這里我們將討論的是ASP.NET MVC中TempData的實(shí)現(xiàn)機(jī)制,希望通過(guò)本文能對(duì)大家有所幫助。

本文將介紹的ASP.NET MVC中的TempData,希望通過(guò)這些分析能為大家了解ASP.NET MVC有所幫助。

今天我們討論的是MVC中一項(xiàng)重要的功能,在其它的一些MVC框架中也很常見(jiàn)它的身影,它就是TempData,下面我們一起來(lái)分析一下TempData的原理。

#t#

內(nèi)容概覽Top

本篇主要討論ASP.NET MVC中TempData是如何實(shí)現(xiàn)的,通過(guò)研讀MVC的源代碼你將清楚的了解MVC是如何實(shí)現(xiàn)TempData功能的。

TempData特性

TempDataDictionary與ITempDataProvider

 

TempDataDictionary的設(shè)計(jì)

 

SessionStateTempDataProvider與ITempDataProvider

 

TempData特性Top

 

TempData的特性就是可以在兩個(gè)Action之間傳遞數(shù)據(jù),它會(huì)保存一份數(shù)據(jù)到下一個(gè)Action,并隨著再下一個(gè)Action的到來(lái)而失效。所以它被用在兩個(gè)Action之間來(lái)保存數(shù)據(jù),比如,這樣一個(gè)場(chǎng)景,你的一個(gè)Action接受一些post的數(shù)據(jù),然后交給另一個(gè)Action來(lái)處理,并顯示到頁(yè)面,這時(shí)就可以使用TempData來(lái)傳遞這份數(shù)據(jù)。

那到底TempData是怎樣完成這個(gè)功能的呢?下面我們從MVC的源代碼入手來(lái)解析TempData的機(jī)制。

TempDataDictionary與ITempDataProviderTop

首先來(lái)看看ITempDataProvider接口,從字面意思上看我們先把它翻譯為:暫時(shí)數(shù)據(jù)的提供者所遵從的規(guī)則,它約定了兩個(gè)方法:

  1. public interface ITempDataProvider {  
  2.     IDictionary LoadTempData(ControllerContext controllerContext);  
  3.     void SaveTempData(ControllerContext controllerContext, IDictionary values);  

 

這兩個(gè)方法是LoadTempData和SaveTempData,我們猜想這兩個(gè)方法是用來(lái)取得TempData容器和保存TempData數(shù)據(jù)的,因?yàn)長(zhǎng)oadTempData返回一個(gè)IDictionary類型,而SaveTempData沒(méi)有返回類型,而參數(shù)ControllerContext就是針對(duì)不同的用戶上下文來(lái)設(shè)計(jì)的,標(biāo)明是對(duì)那一個(gè)上下文的TempData進(jìn)行操作。的確是這樣的,后面會(huì)驗(yàn)證我們的猜想。

 

再來(lái)看看TempDataDictionary,我們對(duì)這個(gè)類的第一印象在哪里呢?是在ControllerBase類中的TempData屬性,在普通的Controller中我們打上tempdata,vs幫助我們完成的那個(gè)屬性其實(shí)就是ControllerBase類中的TempData。因此我們明白了,不管是在controller中,還是在view中,所有對(duì)TempData的操作都是對(duì)TempDataDictionary類型的操作。那ITempDataProvider有是怎么與TempDataDictionary聯(lián)系的呢?看一下TempDataDictionary的設(shè)計(jì)便一目了然。

TempDataDictionary的設(shè)計(jì)Top

public class TempDataDictionary : IDictionary<string, object>, ISerializable

這是TempDataDictionary的簽名,我們看到它繼承了一個(gè)IDictionary<string,object>的字典類型和一個(gè)ISerializable的接口。因此我們知道它是可以被序列化和反序列化的,該類有一個(gè)常字符串類型的字段和一個(gè)Dictionary<string,object>類型的字段:

  1. internal const string _tempDataSerializationKey = "__tempData";  
  2. internal Dictionary<string, object> _data; 

 

在它帶參的構(gòu)造函數(shù)中發(fā)現(xiàn)了對(duì)_tempDataSerializationKey的使用:

 

  1. protected TempDataDictionary(SerializationInfo info, StreamingContext context) {  
  2.     _initialKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);  
  3.     _modifiedKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);  
  4.     _data = info.GetValue(_tempDataSerializationKey, typeof(Dictionary<string, object>))  
  5.             as Dictionary<string, object>;  

我們可以看到這是用來(lái)從一個(gè)流中,反序列化得到一個(gè)Dictionary類型的過(guò)程。

另一點(diǎn),在controller中,我們可以這樣使用TempData的:

  1. TempData["msg"] = new Object();  
  2. Object obj = TempData["msg"as object

在了解它的索引器之前我們先看看它的幾個(gè)字段和方法,TempDataDictionary類重要的字段有三個(gè):

  1. internal Dictionary<string, object> _data;  
  2. private HashSet<string> _initialKeys;  
  3. private HashSet<string> _modifiedKeys; 

_data用來(lái)存放真正的數(shù)據(jù),_initialKeys用來(lái)存放原先數(shù)據(jù)的key,_modifiedKeys用來(lái)存放修改過(guò)或新添加的數(shù)據(jù)key。為什么要這樣呢?回想一下TempData的特性,TempData只存放一次數(shù)據(jù),到第三個(gè)Action時(shí),第一個(gè)Action存放的數(shù)據(jù)就失效了,所以,_initialKeys被設(shè)計(jì)來(lái)存放那些數(shù)據(jù)是原來(lái)的,_modifiedKeys被設(shè)計(jì)來(lái)存放那些數(shù)據(jù)是修改過(guò)的或是新添加上的,這樣就區(qū)分了“舊”數(shù)據(jù)和“新”數(shù)據(jù),那下一步就是把“舊”的刪除,把“新”的記錄了。

我們?cè)俚剿饕骺纯矗驗(yàn)槲覀儗?duì)TempData的操作是從索引器開(kāi)始的,下面是索引器的代碼:

  1. public object this[string key] {  
  2.     get {  
  3.         object value;  
  4.         if (TryGetValue(key, out value)) {  
  5.             return value;  
  6.         }  
  7.         return null;  
  8.     }  
  9.     set {  
  10.         _data[key] = value;  
  11.         _modifiedKeys.Add(key);  
  12.     }  

 

當(dāng)我們TempData["msg"]=new Object();時(shí)不僅向_data中添加了數(shù)據(jù),同時(shí)_modifiedKeys也保存了“新”數(shù)據(jù)的key。那什么時(shí)候“新”數(shù)據(jù)被保存“舊”數(shù)據(jù)被刪除,真正的執(zhí)行呢?這個(gè)過(guò)程是在Load和Save方法中發(fā)生的。下面看它們的具體實(shí)現(xiàn):

 

  1. public void Load(ControllerContext controllerContext, ITempDataProvider tempDataProvider) {  
  2.     IDictionary<stringobject> providerDictionary = tempDataProvider.LoadTempData(  
  3.             controllerContext);  
  4.     _data = (providerDictionary != null) ? new Dictionary<stringobject>(providerDictionary,  
  5.             StringComparer.OrdinalIgnoreCase) : new Dictionary<stringobject>  
  6.             (StringComparer.OrdinalIgnoreCase);  
  7.     _initialKeys = new HashSet<string>(_data.Keys);  
  8.     _modifiedKeys.Clear();  
  9. }  
  10. public void Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider) {  
  11.     if (_modifiedKeys.Count > 0) {  
  12.         // Apply change tracking.  
  13.         foreach (string x in _initialKeys) {  
  14.             if (!_modifiedKeys.Contains(x)) {  
  15.                 _data.Remove(x);  
  16.             }  
  17.         }  
  18.         // Store the dictionary  
  19.         tempDataProvider.SaveTempData(controllerContext, _data);  
  20.     }  

我們看到TempDataDictionary的Load方法首先是調(diào)用了ITempDataProvider的LoadTempData方法來(lái)獲取tempdata容器,然后讓_initialKeys等于_data.Keys,相當(dāng)于保存了“舊”數(shù)據(jù)的key,然后清空_modifiedKeys,相當(dāng)于目前沒(méi)有“新”數(shù)據(jù)。而Save方法則是檢查_(kāi)modifiedKeys.Count是否大于0,就相當(dāng)于檢查是否有“新”數(shù)據(jù),有則調(diào)用ITempDataProveder的SaveTempData方法保存掉“新”數(shù)據(jù)。這里也驗(yàn)證了我們先前的猜想是正確的。

說(shuō)到這里,我們似乎還沒(méi)有發(fā)現(xiàn)沒(méi)有一個(gè)地方調(diào)用TempDataDictionary的Load和Save方法,也就是說(shuō)“新”“舊”數(shù)據(jù)一直在都在_data中,似乎“舊”的數(shù)據(jù)沒(méi)有真正刪除,“新”數(shù)據(jù)也一直沒(méi)有一個(gè)安定的家。

我們說(shuō)對(duì)TempData中數(shù)據(jù)的“刷新”操作(刷新操作即把“舊”數(shù)據(jù)刪除,把“新”數(shù)據(jù)保存)應(yīng)該發(fā)生在執(zhí)行Action的時(shí)候,那在什么地方我們執(zhí)行了Action呢,是在IController的Execute方法中,IController<=ControllerBase<=Controller,順著這樣的繼承順序,我們找到Controller類的ExecuteCore方法,這里是執(zhí)行Action的地方,下面我們看看ExecuteCore方法的實(shí)現(xiàn):

  1. protected override void ExecuteCore() {  
  2.     TempData.Load(ControllerContext, TempDataProvider);  
  3.     try {  
  4.         string actionName = RouteData.GetRequiredString("action");  
  5.         if (!ActionInvoker.InvokeAction(ControllerContext, actionName)) {  
  6.             HandleUnknownAction(actionName);  
  7.         }  
  8.     }  
  9.     finally {  
  10.         TempData.Save(ControllerContext, TempDataProvider);  
  11.     }  

我們看到在這里,Action執(zhí)行之前TempData.Load,Action執(zhí)行之后TempData.Save。這就實(shí)現(xiàn)了TempData的“刷新”操作。

SessionStateTempDataProvider與ITempDataProviderTop

到這里,我們發(fā)現(xiàn)似乎還不知道到底數(shù)據(jù)是怎么被保存的,我們只知道ITempDataProvider提供了一個(gè)保存數(shù)據(jù)和獲取容器的這么一個(gè)約定,那么具體的實(shí)現(xiàn)肯定是繼承了ITempDataProvider接口的類來(lái)做,SessionStateTempDataProvider就是這么一個(gè)類。

我們知道是在Controller類中的ExecuteCore方法中執(zhí)行了“刷新”操作,我們還知道TempDataDictionary的Load和Save方法需要一個(gè)ITempDataProvider的方法,那么我們可以推斷肯定要去Controller類中尋找ITempDataProvider的實(shí)現(xiàn)。如我們所料:

  1. public ITempDataProvider TempDataProvider {  
  2.     get {  
  3.         if (_tempDataProvider == null) {  
  4.             _tempDataProvider = new SessionStateTempDataProvider();  
  5.         }  
  6.         return _tempDataProvider;  
  7.     }  
  8.     set {  
  9.         _tempDataProvider = value;  
  10.     }  

這里使用了屬性注入,強(qiáng)硬的注入了一個(gè)SessionStateTempDataProvider對(duì)象。那么具體是怎樣實(shí)現(xiàn)存儲(chǔ)的就要去看一下SessionStateTempDataProvider類了。

SessionStateTempDataProvider有一個(gè)常字符串字段:

  1. internal const string TempDataSessionStateKey = "__ControllerTempData"

下面是LoadTempData方法:

  1. public virtual IDictionary LoadTempData(ControllerContext controllerContext) {  
  2.     HttpContextBase httpContext = controllerContext.HttpContext;  
  3.     if (httpContext.Session == null) {  
  4.         throw new InvalidOperationException(  
  5.                 MVCResources.SessionStateTempDataProvider_SessionStateDisabled);  
  6.     }  
  7.     Dictionary<stringobject> tempDataDictionary = httpContext.Session[TempDataSessionStateKey]  
  8.                                                         as Dictionary<stringobject>;  
  9.     if (tempDataDictionary != null) {  
  10.         // If we got it from Session, remove it so that no other request gets it  
  11.         httpContext.Session.Remove(TempDataSessionStateKey);  
  12.         return tempDataDictionary;  
  13.     }  
  14.     else {  
  15.         return new Dictionary<stringobject>(StringComparer.OrdinalIgnoreCase);  
  16.     }  

上面的代碼很簡(jiǎn)單,原來(lái)它把Dictionary類型的數(shù)據(jù)存進(jìn)了Session["__ControllerTempData"]里,讀的時(shí)候也只是簡(jiǎn)單的類型轉(zhuǎn)換一下就返回了。

下面是SaveTempData方法:

  1. public virtual void SaveTempData(ControllerContext controllerContext, IDictionary values) {  
  2.     HttpContextBase httpContext = controllerContext.HttpContext;  
  3.     if (httpContext.Session == null) {  
  4.         throw new InvalidOperationException(  
  5.                 MVCResources.SessionStateTempDataProvider_SessionStateDisabled);  
  6.     }  
  7.     httpContext.Session[TempDataSessionStateKey] = values;  

SaveTempData方法也很簡(jiǎn)單。

總結(jié)Top

ITempDataProvider只是一個(gè)提供臨時(shí)數(shù)據(jù)存取的一個(gè)約定的接口,它并不提供如何管理“新舊”數(shù)據(jù),TempDataDictionary類才是真正管理“新舊”數(shù)據(jù)的管理者,但是這個(gè)“管理者”需要一個(gè)存取“新舊”數(shù)據(jù)的途徑,也就是說(shuō)它告訴ITempDataProvider該存什么該取什么,然后由ITempDataProvider真正的去執(zhí)行存取操作。在Controller執(zhí)行Action之前,這個(gè)“管理者”要取得上一次的“舊”數(shù)據(jù),Action結(jié)束之后它還要把“新”數(shù)據(jù)給存起來(lái)。而Controller恰似這么一個(gè)“指揮者”,它把一個(gè)能做ITempDataProvider事情的類——SessionStateTempDataProvider交給TempDataProvider使用。下面用一個(gè)類圖概括一下幾個(gè)類的關(guān)系。

結(jié)構(gòu)圖 

原文標(biāo)題:揭秘ASP.NET mvc TempData機(jī)制

鏈接:http://www.cnblogs.com/niuchenglei/archive/2009/12/19/1627988.html

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-04-08 09:58:07

ASP.NET MVCTempData框架

2009-12-07 09:23:05

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-07 10:14:57

基于URL權(quán)限控制

2009-06-15 10:57:51

FluentHtmlASP.NET MVC

2011-01-28 09:45:29

ASP.NET MVC

2009-07-20 12:42:04

MvcContrib.ASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-07-27 13:01:28

TreeViewASP.NET

2009-07-28 14:47:18

ASP.NET MVC

2011-06-08 11:36:16

ASP.NETrender

2009-07-22 13:16:04

MvcAjaxPaneASP.NET MVC

2009-07-22 16:11:43

ASP.NET AJA

2009-07-20 15:30:11

ASP.NET應(yīng)用

2009-07-24 10:52:42

ASP.NET ISA

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-09-24 09:26:22

ASP.NET MVC

2009-06-01 10:23:31

asp.net mvcasp.net mvc.net mvc框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

中文字幕久热精品在线视频 | 国产欧美日韩中文| 天堂久久久久久| 成入视频在线观看| 91丝袜美腿高跟国产极品老师| 羞羞色国产精品| 日本少妇xxxx软件| 亚洲校园激情春色| 亚洲国产成人午夜在线一区| 亚洲va男人天堂| 亚洲国产精品午夜在线观看| 欧美禁忌电影网| 欧美日本在线观看| 老太脱裤让老头玩ⅹxxxx| 婷婷伊人综合中文字幕| 秋霞av亚洲一区二区三| 不卡av电影院| 日韩在线视频观看正片免费网站| 欧美日韩国产三区| 夜夜爽8888| 亚洲私拍自拍| 在线激情影院一区| 人妻精品久久久久中文字幕69| 黄视频网站在线观看| 久久久精品综合| 亚洲a一级视频| 99精品视频99| 亚洲a一区二区三区| 欧美一级高清片| 国产一区二区三区精彩视频| 成人在线观看免费网站| 成人午夜av电影| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 无码人妻精品一区二| 水蜜桃精品av一区二区| 亚洲国产精品成人va在线观看| 欧美婷婷精品激情| 手机在线理论片| 亚洲另类色综合网站| 日本一区二区三区免费观看| 欧美一级特黄aaaaaa大片在线观看| 日韩av在线发布| 久久全球大尺度高清视频| 久久嫩草捆绑紧缚| 精品国产一区二区三区噜噜噜 | 91丨porny丨对白| 电影一区二区| 亚洲成人av电影在线| 精品人妻大屁股白浆无码| 免费黄色电影在线观看| 久久女同精品一区二区| 欧美乱大交做爰xxxⅹ性3| 久久久久久久久久久电影| 日韩mv欧美mv国产网站| 丰满少妇xbxb毛片日本| 亚洲精品资源在线| 黑人一区二区| 国产永久免费高清在线观看视频| 美女被艹视频网站| 日本欧美一二三区| 欧亚洲嫩模精品一区三区| 亚洲午夜未满十八勿入免费观看全集| 在线免费观看成人| 毛片基地黄久久久久久天堂| 91在线观看喷潮| 偷拍盗摄高潮叫床对白清晰| 国产丝袜一区二区三区| 成人h动漫精品一区二| 牛牛澡牛牛爽一区二区| 国产精品毛片va一区二区三区| 99国产精品视频免费观看| 精品无吗乱吗av国产爱色| 国产精品12p| 亚洲v日本v欧美v久久精品| 日韩精品一区二区久久| 特级西西人体高清大胆| 欧美一区二区播放| 捆绑调教美女网站视频一区| 欧美jizz18| 国产精品一区二区三区www| 一区二区激情视频| 国产系列第一页| 国产福利视频在线观看| 亚洲欧洲av在线| 国产卡一卡二在线| 中日韩高清电影网| 亚洲一卡二卡三卡四卡| 超碰成人免费在线| 日本不卡1234视频| 国 产 黄 色 大 片| www.亚洲自拍| 精品一区二区视频| 亚洲色无码播放| 久久综合久久综合久久综合| 亚洲码欧美码一区二区三区| 头脑特工队2免费完整版在线观看| 中文字幕视频精品一区二区三区| 69av一区二区三区| 爱情岛论坛亚洲自拍| 亚洲综合在线网站| 国产高清不卡| 色综合久久综合网97色综合| 亚洲最大综合网| 麻豆视频久久| 亚洲精品福利在线| 欧美熟妇激情一区二区三区| 999久久久精品国产| 欧美伦理91i| 日本中文字幕久久| 韩国三级在线一区| 精品欧美日韩| 9i精品一二三区| 亚洲综合免费观看高清完整版在线| 国产精品久久中文字幕| 四虎影视4hu4虎成人| 欧美一区二区三区视频免费播放| 西西大胆午夜视频| 亚洲不卡av不卡一区二区| 国模精品系列视频| www.欧美色| 国产91露脸合集magnet| 日韩一区二区三区高清| 欧美人与性动交α欧美精品济南到| 欧美丝袜一区二区三区| 国产成人精品视频ⅴa片软件竹菊| 国产日韩欧美中文在线| 美女网站色91| 久久久久这里只有精品| 久久久久久无码精品大片| 国产aⅴ综合色| 久草一区二区| 男人资源在线播放| 性欧美疯狂xxxxbbbb| 天天影视色综合| 青青一区二区| 欧美日本中文字幕| 国产片在线播放| 亚洲欧美在线aaa| a在线观看免费视频| 九色精品91| 日本午夜精品理论片a级appf发布| 丰满熟妇乱又伦| 亚洲一区二区中文在线| 无码人妻少妇色欲av一区二区| 久久视频在线| 国产欧美日韩中文字幕在线| yjizz视频网站在线播放| 日本高清不卡一区| 伊人网伊人影院| 午夜在线视频一区二区区别| 噜噜噜噜噜久久久久久91| 91超碰国产在线| 亚洲黄色www网站| 99热只有这里有精品| 99久久精品99国产精品| 国产淫片免费看| 日韩三级av| 国产va免费精品高清在线| 理论在线观看| 精品视频免费在线| 99久久99久久精品国产| 国产一区二区不卡在线| 女女百合国产免费网站| 久久发布国产伦子伦精品| 欧美**字幕| 国产欧美va欧美va香蕉在| 欧美成人三区| 日韩亚洲欧美中文三级| 日韩成人在线免费视频| 91社区在线播放| 午夜两性免费视频| 中文精品久久| 国产在线一区二区三区欧美| 综合日韩av| 日韩在线小视频| 成人1区2区3区| 欧美性xxxxxxxxx| 少妇的滋味中文字幕bd| 国产大陆a不卡| 黄色免费福利视频| 日本电影一区二区| 99国产在线视频| 超碰aⅴ人人做人人爽欧美| 中文字幕av一区二区三区谷原希美| 国产尤物在线观看| 亚洲国产美女搞黄色| 级毛片内射视频| 国产精品综合网| 欧美三级一级片| 国产精品97| 久久久影院一区二区三区 | 国产日韩欧美不卡在线| 亚洲天堂av一区二区三区| 日韩视频二区| 欧美激情精品久久久久久久变态 | 高清国产一区二区| 午夜视频在线瓜伦| 午夜激情一区| 日本一区二区三区免费看| 日韩欧美中文字幕在线视频| 日本欧美黄网站| 男女视频在线| www国产精品视频| 日韩私人影院| 欧美sm美女调教| 中文字字幕在线观看| 午夜日韩在线电影| 欧美一区免费观看| 国产日韩欧美制服另类| 国产视频精品视频| 国内精品伊人久久久久av一坑 | 亚洲国产日韩美| 鲁大师精品99久久久| 91精品在线看| yiren22亚洲综合| 高清视频欧美一级| 18+视频在线观看| 夜夜躁日日躁狠狠久久88av| 天天操天天干天天干| 欧美一级日韩免费不卡| 中文字幕日韩第一页| 欧美性生活大片免费观看网址| 午夜69成人做爰视频| 国产精品三级电影| 亚洲国产av一区| 99re热视频这里只精品| 国产精品果冻传媒| 国产精品一区二区在线看| 成人性生交免费看| 永久免费看片在线播放| 亚洲人成高清| 日本人妻伦在线中文字幕| 久久综合av| 天堂资源在线亚洲资源| 亚洲盗摄视频| 久久久久久久久一区| 高清日韩中文字幕| av激情久久| 亚洲第一二区| 91情侣在线视频| 欧美午夜网站| 999精品视频一区二区三区| 成人亚洲精品| 亚洲va欧美va国产综合剧情| 亚洲精品aaa| 成人国产在线视频| 中文成人激情娱乐网| 成人免费大片黄在线播放| 国产黄色精品| 欧美日免费三级在线| 欧美激情精品久久久久久免费| 国产色产综合色产在线视频| 无码人妻精品一区二区三应用大全| 99久久婷婷国产| 欧美激情第四页| 国产一区二区美女| 婷婷中文字幕在线观看| 国产一区二区免费视频| 精品伦一区二区三区| av网站免费线看精品| 亚洲第九十七页| 国模雨婷捆绑高清在线| 亚洲精品国产欧美| 日韩大胆人体| 自拍偷拍亚洲精品| а√天堂在线官网| 久久久久久尹人网香蕉| 涩涩视频在线播放| 国产精品成人免费电影| 四虎影视国产精品| 福利视频久久| 欧美男男gaytwinkfreevideos| 特级西西444www大精品视频| 久久精品亚洲欧美日韩精品中文字幕| 男人j进女人j| 一本综合久久| 99热这里只有精品在线播放| 国产精品99久久不卡二区| 好男人香蕉影院| 国产无一区二区| 波兰性xxxxx极品hd| 亚洲一区二区黄色| 日韩免费av网站| 欧美一区三区四区| 日韩专区一区二区| 久久精品国产亚洲精品2020| 俺来也官网欧美久久精品| 国产精品日韩在线播放| 亚洲日本一区二区三区在线| 免费精品视频一区| 久久久久电影| 人妻精品无码一区二区三区| 紧缚奴在线一区二区三区| 老司机午夜免费福利| 国产欧美精品一区二区色综合朱莉| 欧日韩不卡视频| 婷婷久久综合九色国产成人| 伊人久久国产精品| 亚洲精品久久久久中文字幕二区| 欧美私人网站| 欧美在线观看一区二区三区| 国产成人免费av一区二区午夜| 久久日韩精品| 欧美啪啪一区| 中文字幕亚洲乱码| 久久亚洲综合av| 国产免费内射又粗又爽密桃视频 | 国内精品久久影院| av有声小说一区二区三区| 成人情视频高清免费观看电影| av中字幕久久| 又粗又黑又大的吊av| 国内精品国产三级国产a久久| 女~淫辱の触手3d动漫| 亚洲一二三区在线观看| 97超视频在线观看| 一区二区欧美久久| 亚洲天堂手机| 国产一区二区三区四区五区加勒比| 亚洲国产精品日韩专区av有中文 | 黑人巨大国产9丨视频| 玖玖玖国产精品| 内射中出日韩无国产剧情| 亚洲精品免费一二三区| 一道本无吗一区| 一区二区三区亚洲| 中文字幕色婷婷在线视频| 国产精品一区二区三区免费观看| 亚洲色图插插| 黄色一级片免费的| 中文字幕欧美日韩一区| 人人妻人人爽人人澡人人精品| 亚洲国产一区自拍| heyzo高清中文字幕在线| 91九色蝌蚪嫩草| 欧美成人亚洲| 三级黄色片免费看| 亚洲欧美综合色| 一区二区三区免费观看视频| 中文在线资源观看视频网站免费不卡| 国产三级日本三级在线播放| 国产精品一区二区黑丝| 成年人二级毛片| 69久久99精品久久久久婷婷 | 日韩精选在线| 人人妻人人添人人爽欧美一区| 成人免费av网站| 国产手机在线视频| 日韩精品久久久久久福利| 日韩深夜视频| 欧美一区二区综合| 久久中文精品| 日本视频在线免费| 欧美精选午夜久久久乱码6080| 在线a人片免费观看视频| 国产欧美亚洲视频| 亚洲五月综合| 国产人妻黑人一区二区三区| 天天综合天天综合色| 国内精品一区视频| 国产精品视频yy9099| 亚洲91中文字幕无线码三区| 欧美日韩一区二区区| 亚洲国产精品天堂| 天堂中文资源在线| 国产精品久久中文| 小处雏高清一区二区三区| av漫画在线观看| 日韩欧美国产黄色| 一区二区三区视频在线观看视频| 国产欧美日韩专区发布| 欧美三级黄美女| 亚洲熟妇一区二区三区| 欧美午夜一区二区三区| 国产成人无吗| 久99久视频| 韩国女主播成人在线观看| 国产香蕉在线视频| 一区二区三区美女xx视频| 高清在线一区二区| www.中文字幕在线| 国产精品毛片高清在线完整版| 精品美女www爽爽爽视频| 中文字幕一区二区三区不卡在线| 成人免费视频网站入口::| 亚洲第一综合天堂另类专| 全球最大av网站久久| 日韩欧美猛交xxxxx无码| 久久久电影一区二区三区| 国产精品女人久久久| 97免费在线视频| 欧美电影一二区| 亚洲av无码一区二区三区网址| 精品视频一区三区九区| 丁香花在线电影| 亚洲一区二区在| 91免费观看国产| 国产欧美日韩综合精品一区二区三区| 欧美一级视频在线观看| 欧美一区二区三区另类 |