亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

在ASP.NET 2.0中操作數據之三十五:使用Repeater和DataList單頁面實現主/從報表

2024-07-10 13:30:29
字體:
來源:轉載
供稿:網友
前面已經介紹了ASP.NET 2.0中如何使用兩個頁面實現主/從報表,本文主要講解,如何使用一個單獨頁面實現主/從報表。
 

導言

  在前面一章里我們學習了如何用兩個頁分別顯示主/從信息。在“主”頁里我們用Repeater來顯示category。每個category的name都是一個鏈到“從”頁的hyperlink。在從頁里用一個兩列的DataList顯示選中的category下的product。本章我們將還是使用單頁,在左邊顯示category列表,category的名字用LinkButton顯示。點擊其中一個時頁面postback,在右邊以兩列的DataList顯示出相關的product。除了名字外,左邊的Repeater還會顯示與該category相關聯的product總數。(見圖1)

ASP.NET,操作數據,Repeater,DataList
圖 1: Category的 Name 和 Product總數顯示在左邊

第一步: 在頁面左部顯示一個Repeater

  本章我們將在左邊顯示category,右表顯示它關聯的product。web頁的內容可以使用標準HTML元素或者CSS來定位。到目前為止我們都是使用CSS來定位。在母板頁和站點導航 一章里我們使用絕對定位來創建導航時,為導航列表和內容之間指定了明確的距離。當然CSS也可以用來對兩個元素的位置進行調整。

  打開DataListRepeaterFiltering文件夾下的CategoriesAndProducts.aspx頁,添加一個Repeater和DataList.ID分別設置為Categories和CategoryProducts。然后到源視圖里將它們分別放到<div>元素里。也就是說在Repeater后面加一個閉合的</div>,在DataList前加一個開始的<div>?,F在你的代碼看起來應該和下面差不多:

<div> <asp:Repeater ID="Categories" runat="server"> </asp:Repeater></div><div> <asp:DataList ID="CategoryProducts" runat="server"> </asp:DataList></div>

我們需要使用float屬性來將Repeater放到DataList左邊,見下面代碼:

<div> Repeater</div><div> DataList</div>

  float:left 將第一個<div>放到第二個的左邊。width和padding-right指定了第一個<div>的寬和<div>內容和右邊框的距離。更多的floating元素信息請參考Floatutorial.我們在Styles.css里創建一個新的CSS類,名為Floatleft(而不是直接在<p>的樣式里設置):

.FloatLeft{ float: left; width: 33%; padding-right: 10px;}

  然后我們用<div class="FloatLeft">將<div style="float:left">替換掉。
完成以上所講的內容后,切換到設計視圖。你應該看到Repeater已經在DataList左邊了(由于還沒有配置數據源或模板,這兩個控件都是灰的)。

ASP.NET,操作數據,Repeater,DataList
圖 2: 調整完位置后的頁面

第二步: 獲取每個Category關聯的Products總數

  完成了樣式設置后,我們現在來將category數據綁定到Repeater。如圖1所示,除了category名字外,我們需要顯示和它關聯的product總數,為了獲取這個信息我們可以:

  在ASP.NET page的code-behind 里獲取這個信息. 根據給定的categoryID我們可以通過ProductsBLL類的GetProductsByCategoryID(categoryID)方法來獲取關聯的product總數。這個方法返回一個ProductsDataTable對象,它的Count屬性表示了我們需要知道的信息。我們可以為Repeater創建一個ItemDataBound event handler,在每個category綁定到Repeater時調用這個方法然后將總數輸出。

  在DataSet里更新CategoriesDataTable 添加一個NumberOfProducts列. 我們可以更新CategoriesDataTable的GetCategories()方法來包含這個信息或者保留這個方法,再創建一個新的名為GetCategoriesAndNumberOfProducts()方法。

  我們來看看這兩種方法。第一種寫起來更簡單,因為我們不需要更新DAL。但是它需要和數據庫更多的連接。在ItemDataBound event handler里調用GetProductsByCategoryID(categoryID)方法又增加了一次數據庫連接(這在每個category綁定時會發生一次)。這時一共會有N+1次對數據庫的請求(N為Repeater里顯示的category的總數)。而第二種方法product總數從GetCategories()(或GetCategoriesAndNumberOfProducts())方法返回,這樣只請求一次數據庫就可以了。

在ItemDataBound Event Handler里獲取Products總數

  在ItemDataBound event handler里獲取product總數不需要修改DAL。只需要直接修改CategoriesAndProducts.aspx頁。通過Repeater的智能標簽添加一個新的名為CategoriesDataSource的ObjectDataSource。使用CategoriesBLL類的GetCategories()方法配置它。

ASP.NET,操作數據,Repeater,DataList
圖 3: 配置 ObjectDataSource

  Repeater里的每個Category都是可點的,而且在點了之后,CategoryProducts DataList會顯示那些相關的product。我們可以將每個category設為hyperlink,鏈到本頁(CategoriesAndProducts.aspx),通過querystring為CategoryID賦值。這種方法的好處是,特定category的product可以通為搜索建立索引和書簽。

  我們也可以將每個category設為LinkButton,在本章我們使用這個方法。LinkButton看起來象一個hyperlink,但是點擊后會產生一個postback。DataList的ObjectDataSource會刷新以顯示選中category相關聯的product。在本章使用hyperlink更合理。然而在別的情況下可以使用LinkButton會好一點。雖然是這樣,我們在這里也使用LinkButton。我們將會看到,使用LinkButton會有一些使用hyperlink時碰不到的挑戰。因此我們可以學習更好學習它,以便以后使用。

  注意:如果你使用HyperLink或<a>來代替LinkButton來重復練習一次本章的內容,是最好不過了。

下面的標記語言是Repeater和ObjectDataSource的,注意Repeater的template將每個item表示為LinkButton。

<asp:Repeater ID="Categories" runat="server" DataSourceID="CategoriesDataSource"> <HeaderTemplate>  <ul> </HeaderTemplate> <ItemTemplate>  <li><asp:LinkButton runat="server" ID="ViewCategory" /></li> </ItemTemplate> <FooterTemplate>  </ul> </FooterTemplate></asp:Repeater><asp:ObjectDataSource ID="CategoriesDataSource" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetCategories" TypeName="CategoriesBLL"></asp:ObjectDataSource>
           

  注意:在本章Repeater的view state必須開啟(Repeater的聲明語法里的EnableViewState="False")。在第三步我們將為ItemCommand事件創建一個event handler,在它里面我們要更新DataList的ObjectDataSource的SeleceParameters集合。如果view state 被禁用的話Repeater的ItemCommand不會被激發。想了解具體的原因和更多的信息請參考 A Stumper of an ASP.NET Question 和its solution 。

  ID為ViewCategory的LinkButton還沒有設置Text屬性。如果我們只需要顯示category名字,我們可以通過綁定語法象下面這樣來直接設置:

<asp:LinkButton runat="server" ID="ViewCategory" Text='<%# Eval("CategoryName") %>' />

然而在這里我們需要顯示的是category的name和proudct的總數。見下面的代碼:

protected void Categories_ItemDataBound(object sender, RepeaterItemEventArgs e){ // Make sure we're working with a data item... if (e.Item.ItemType == ListItemType.Item ||  e.Item.ItemType == ListItemType.AlternatingItem) {  // Reference the CategoriesRow instance bound to this RepeaterItem  Northwind.CategoriesRow category =   (Northwind.CategoriesRow) ((System.Data.DataRowView) e.Item.DataItem).Row;  // Determine how many products are in this category  NorthwindTableAdapters.ProductsTableAdapter productsAPI =   new NorthwindTableAdapters.ProductsTableAdapter();  int productCount =   productsAPI.GetProductsByCategoryID(category.CategoryID).Count;  // Reference the ViewCategory LinkButton and set its Text property  LinkButton ViewCategory = (LinkButton)e.Item.FindControl("ViewCategory");  ViewCategory.Text =   string.Format("{0} ({1:N0})", category.CategoryName, productCount); }}         

  我們首先要確保我們處理的是data item(ItemType為Item或AlternatingItem)然后引用剛剛綁定到當前RepeaterItem的CategoriesRow。然后調用GetCategoriesByProductID(categoryID)方法,通過Count屬性獲取返回的記錄條數。最后將ItemTemplate里的ViewCategory LinkButton的Text屬性設為"CategoryName(NumberOfProductsInCategory)"。

  注意:我們也可以在ASP.NET頁的code-behind里寫一個格式化功能,接收CategoryName和CategoryID的值,返回CategoryName和product總數的連接字符串。然后將結果直接賦給LinkButton的Text屬性,而不需要處理itemDataBound事件。更多的格式化功能信息參考在GridView控件中使用TemplateField 和格式化DataList和Repeater的數據。添加完event handler后,在瀏覽器里看看頁面。見圖4。

ASP.NET,操作數據,Repeater,DataList
圖 4: 顯示每個 Category的 Name 和 Products總數

  更新CategoriesDataTable和CategoriesTableAdpter來包含每個Category的Product總數除了在每個category綁定到Repeater時獲取product總數外,我們還可以修改DAL里CategoriesDataTable和CategoriesTableAdapter來包含這個信息.我們在CategoriesDataTable里加一列.打開App_Code/DAL/Northwind.xsd,右鍵點DataTable,選擇Add/Column.見圖5.

ASP.NET,操作數據,Repeater,DataList
圖 5: 為CategoriesaDataSource增加一個新列

  這樣會添加一個名為Column1的列,你可以很方便的修改它的名字.將它重命名為NumberOfProducts.然后我們需要配置這列的屬性.點這個列,來到屬性窗口.將DataType從System.String修改為System.Int32.將ReadOnly屬性設為True.見圖6.

ASP.NET,操作數據,Repeater,DataList
圖 6: 設置新列的屬性

  現在CategoriesDataTable里已經包含了NumberOfProducts列,但它的值還沒有設置.我們可以修改GetCategories()方法,當每次獲取category信息的時候返回它的信息.在這里由于只是本章用到了這個數據,我們來創建一個新的名為GetCategoriesAndNumberOfProducts().右鍵點CategoriesTableAdapter,選擇New Query.會出現TableAdapter Query配置向導.選擇SQL statement.

ASP.NET,操作數據,Repeater,DataList
圖 7: 選擇SQL Statement

ASP.NET,操作數據,Repeater,DataList
圖 8: SQL Statement 返回行數

下一步需要我們寫sql語句.下面的語句返回每個category的CategoryID,CategoryName,Description和相關product的總數:

SELECT CategoryID, CategoryName, Description,  (SELECT COUNT(*) FROM Products p WHERE p.CategoryID = c.CategoryID)   as NumberOfProductsFROM Categories c
     

ASP.NET,操作數據,Repeater,DataList
圖 9: 使用的sql語句

  注意計算product總數的子查詢的別名為NumberOfProducts.它和CategoriesDataTable的NumberOfProducts列關聯.最后一步是寫方法的名字.分別為Fill a DataTable和Return a DataTable命名為FillWithNumberOfProducts和GetCategoriesAndNumberOfProducts.

ASP.NET,操作數據,Repeater,DataList
圖 10: 為新的TableAdapter的方法命名

  現在DAL已經修改完了.由于我們所有展現層,BLL,DAL是逐層調用,所以我們需要在CategoriesBLL類的添加相應的GetCategoriesAndNumberOfProducts方法.

[System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Select, false)]public Northwind.CategoriesDataTable GetCategoriesAndNumberOfProducts(){ return Adapter.GetCategoriesAndNumberOfProducts();}
       

  完成DAL和BLL后,我們來將數據綁定到Categories Repeater.如果在"在ItemDataBound Event Handler里獲取Products總數"那部分里你已經為Repeater創建了ObjectDataSource,刪掉它,然后去掉Repeater的DataSourceID屬性,同樣去掉ItemDataBound事件.Repeater現在回到了初始狀態,添加一個名為CategoriesDataSource的ObjectDataSource.使用CategoriesBLL類的GetCategoriesAndNumberOfProducts()方法來配置它.見圖11.

ASP.NET,操作數據,Repeater,DataList
圖 11: 配置ObjectDataSource

  然后修改ItemTemplate,使用數據綁定語法來將CategoryName和NumberOfProducts字段綁定到LinkButton的Text屬性.完整的標記語言如下:

<asp:Repeater ID="Categories" runat="server" DataSourceID="CategoriesDataSource"> <HeaderTemplate>  <ul> </HeaderTemplate> <ItemTemplate>  <li><asp:LinkButton runat="server" ID="ViewCategory"    Text='<%# String.Format("{0} ({1:N0})", _     Eval("CategoryName"), Eval("NumberOfProducts")) %>' />  </li> </ItemTemplate> <FooterTemplate>  </ul> </FooterTemplate></asp:Repeater><asp:ObjectDataSource ID="CategoriesDataSource" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetCategoriesAndNumberOfProducts" TypeName="CategoriesBLL"></asp:ObjectDataSource>

使用這種方法的頁面看起來和前面一種方法一樣(見圖4).

第三步: 顯示選中的Category關聯的Products

  現在category和product總數的部分已經完成.Repeater將每個category顯示為LinkButton,當點擊時產生postback,這時我們需要將那些關聯的product在CategoryProducts DataList里顯示出來.

  現在我們面臨的一個挑戰是如何將特定category下的product在DataList里顯示出拉一.在使用GridView 和DetailView實現的主/從報表一章里我們學習了創建一個GirdView,當選擇它的一行時將"從"信息在本頁的DetailsView里顯示出來.GridView的ObjectDataSource用ProductsBLL的GetProducts()返回product信息.而DetailsView的ObjectDataSource用GetProductsByProductID(productID)返回選中的product信息.productID參數通過GirdView的SelectedValue屬性來提供.不幸的是,Repeater沒有SelectedValue屬性.

  注意:這是我們在Repeater里使用LinkButton的其中一個挑戰.如果我們使用hperlink,可以通過querystring來傳遞CategoryID.在我們解決這個問題前,首先將ObjectDataSource綁定到DataList,然后指定ItemTemplate.從DataList的智能標簽添加一個名為CategoryProductsDataSource的ObjectDataSource,并使用ProductsBLL類的GetProductsByCategoryID(cateogryID)配置它.由于此DataList只提供只讀功能,因此在INSERT,UPDATE,DELETE標簽里選擇None.

ASP.NET,操作數據,Repeater,DataList
圖 12: 配置 ObjectDataSource

  由于GetProductsByCategoryID(categoryID)方法需要一個輸入參數,向導會要求我們指定參數源.我們使用GridView或DataList列出categories時,可以將參數源設為Control,ControlID設為數據控件的ID.然而由于Repeater沒有SelectedValue屬性,所以不能用作參數源.你可以查看ControlID下拉列表,它里面只包含一個控件ID—CategoryProducts(DataList).

ASP.NET,操作數據,Repeater,DataList
圖 13: 配置參數

  配置完數據源后,Visual Studio為DataList自動產生ItemTemplate.用我們前面使用的template替換默認的ItemTemplate.將DataList的RepeatColumns屬性設為2.完成這些后,你的代碼應該和下面的差不多:

<asp:DataList ID="CategoryProducts" runat="server" DataKeyField="ProductID" DataSourceID="CategoryProductsDataSource" RepeatColumns="2" EnableViewState="False"> <ItemTemplate>  <h5><%# Eval("ProductName") %></h5>  <p>   Supplied by <%# Eval("SupplierName") %><br />   <%# Eval("UnitPrice", "{0:C}") %>  </p> </ItemTemplate></asp:DataList><asp:ObjectDataSource ID="CategoryProductsDataSource" OldValuesParameterFormatString="original_{0}" runat="server" SelectMethod="GetProductsByCategoryID" TypeName="ProductsBLL"> <SelectParameters>  <asp:Parameter Name="categoryID" Type="Int32" /> </SelectParameters></asp:ObjectDataSource> 
     

  目前為止CategoryProductsDataSource ObjectDataSource的categoryID參數還沒有設置.所以瀏覽頁面時沒有任何的product顯示出來.我們現在需要將它設置為Repeater中的被點擊的category的CategoryID.這里有兩個問題,第一是我們如何判斷什么時候Repeater的ItemTemplate被點了.二是哪個被點了.

  和Button,ImageButton一樣,LinkButton有一個Click event和一個Command event.Click事件僅僅用來說明LinkButton被點擊了.有時候我們需要傳遞更多的信息到event handler里.這樣的話,就需要使用LinkButton的CommandName 和CommandArgument .當LinkButton被點時,Command事件激發,event handler會接受CommandName和CommandArgument的值.

  當Repeater里的template里激發了一個Command事件時,Rpeater的ItemCommand事件被激發.并將被點擊的LinkButton(或者Button和ImageButton)的CommandName和CommandArgument的值傳進來.因此,判斷category LinkButton什么時候被點擊了,我們需要:

  設置Rpeater里的ItemTemplate的LinkButton的CommandName屬性(我使用的"ListProducts").設置了值后LinkButton被點后Command事件會激發.

  設置LinkButton的CommandArgument屬性為當前item的CategoryID.
為Repeater的ItemCommand事件創建一個event handler.在它里面將傳入的CommandArgument值賦給CategoryProductsDataSource ObjectDataSource的CategoryID參數.

下面是完成了1,2步后的標記.注意CategoryID是如何通過綁定語法來賦給CommandArgument的.

<ItemTemplate> <li>  <asp:LinkButton CommandName="ListProducts" runat="server"   CommandArgument='<%# Eval("CategoryID") %>' ID="ViewCategory"   Text='<%# string.Format("{0} ({1:N0})", _    Eval("CategoryName"), Eval("NumberOfProducts")) %>'>  </asp:LinkButton> </li></ItemTemplate>

  由于任何一個Button,LinkButton或ImageButton的Command事件都會激發ItemCommand事件,所以無論在任何時候創建ItemCommand event handler首先都要小心謹慎的檢查CommandName的值.而由于我們現在只有一個LinkButton,以后我們可能會向Repeater添加新的button控件,當點被點擊時,激發同樣的ItemCommand event handler.因此最好確保檢查了CommandName,然后根據它的值來進行邏輯處理.

  在確保了傳入的CommandName的值等于"ListProducts"后,event handler將CategoryProductsDataSource ObjectDataSource的CategoryID的參數設為傳入的CommandArgument.對ObjectDataSource的SelectParameters的修改自動引起DataList重新綁定到數據源,顯示新的選中的category關聯的product.

protected void Categories_ItemCommand(object source, RepeaterCommandEventArgs e){ // If it's the "ListProducts" command that has been issued... if (string.Compare(e.CommandName, "ListProducts", true) == 0) {  // Set the CategoryProductsDataSource ObjectDataSource's CategoryID parameter  // to the CategoryID of the category that was just clicked (e.CommandArgument)...  CategoryProductsDataSource.SelectParameters["CategoryID"].DefaultValue =   e.CommandArgument.ToString(); }}

  做完這些后,本章就結束了!現在在瀏覽器里看看你的頁面.圖14是第一次瀏覽時的樣子.因為還沒有category被選中,所以沒有product顯示出來.點擊一個category,比如Produce,和它關聯的product以兩列的方式顯示出來.見圖15.

ASP.NET,操作數據,Repeater,DataList
圖 14:第一次瀏覽頁面時沒有Product顯示

ASP.NET,操作數據,Repeater,DataList
圖 15: 點擊Produce Category 后,相關的 Products 在右邊顯示出來

總結

  我們在本章和前面一章里學習了主/從表可以分別顯示在兩個頁或者一起顯示在一個頁.如果顯示在一個頁上,我們需要考慮如何來控制它們的外觀.在使用GridView 和DetailView實現的主/從報表一章我們將從記錄顯示在主記錄之上,而在本章我們使用CSS將主記錄顯示在從記錄的左邊.我們還探討了如何獲取每個category關聯的product數量,以及在點擊Repeater里的LinkButton(或ButtonImageButton)時服務器端的處理邏輯.

  到這里為止使用DataList和Repeater來顯示主/從表已經完成了.后面我們將演示如何在DataList里添加編輯和刪除的功能.

  祝編程愉快!



注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
红桃视频成人在线观看| 亚洲第一视频网| 成人av在线网址| 日韩大陆毛片av| 欧美影院成年免费版| 亚洲国产精品中文| 亚洲第一免费网站| 国模叶桐国产精品一区| 高清亚洲成在人网站天堂| 久久成年人视频| 久久69精品久久久久久国产越南| 国产专区精品视频| 久久在精品线影院精品国产| 亚洲第一精品久久忘忧草社区| 久久久免费高清电视剧观看| 国产成人精品久久亚洲高清不卡| 欧美一级在线亚洲天堂| 国产aaa精品| 久久精品美女视频网站| 精品亚洲一区二区三区| 亚洲午夜国产成人av电影男同| 夜夜躁日日躁狠狠久久88av| 亚洲综合色激情五月| 欧美精品在线观看91| 这里只有视频精品| 九九视频这里只有精品| 亚洲天堂免费观看| 92看片淫黄大片欧美看国产片| 97超视频免费观看| 亚洲高清在线观看| 国产精品69久久久久| 久久久久久国产免费| 91色视频在线观看| 久久人人爽人人爽人人片av高清| 亚洲综合视频1区| 亚洲影院污污.| 亚洲国产欧美一区二区三区久久| 亚洲激情小视频| 在线观看日韩视频| 亚洲欧美日韩直播| 欧美日韩在线视频一区| 日韩在线观看免费| 在线中文字幕日韩| 欧美一级视频在线观看| 欧美性猛交xxxx乱大交3| 欧美黑人视频一区| 成人性教育视频在线观看| 亚洲伊人成综合成人网| 亚洲尤物视频网| 国产成人涩涩涩视频在线观看| 日韩欧美主播在线| 欧美午夜美女看片| 国产伦精品免费视频| 日韩中文字幕久久| 国产精品久久久亚洲| 欧美在线国产精品| 精品欧美国产一区二区三区| 亚洲视频网站在线观看| 欧美午夜激情视频| 国产不卡在线观看| 国产精品r级在线| 国自在线精品视频| 中文字幕在线视频日韩| 色与欲影视天天看综合网| 国产综合在线观看视频| 色先锋资源久久综合5566| 亚洲第一区中文字幕| 亚洲免费精彩视频| 97在线日本国产| 黑丝美女久久久| 欧美精品少妇videofree| 亚洲性生活视频在线观看| 夜夜狂射影院欧美极品| 亚洲石原莉奈一区二区在线观看| 在线看福利67194| 岛国av一区二区在线在线观看| 国产视频精品久久久| 国产精品久久久精品| 国产亚洲精品一区二555| 91精品国产99久久久久久| 国产精品一区专区欧美日韩| 精品一区二区三区电影| 国产精品久久久久久久久久东京| 欧美国产日本高清在线| 色综合亚洲精品激情狠狠| 亚洲精品日韩av| www.欧美精品| 久久精品99无色码中文字幕| 久久成人亚洲精品| 亚洲国产99精品国自产| 激情av一区二区| 蜜臀久久99精品久久久无需会员| 尤物九九久久国产精品的特点| 国产精品视频白浆免费视频| 国产精品国产福利国产秒拍| 日韩精品在线观| 成人a在线视频| 国产91对白在线播放| 国产精品99久久久久久白浆小说| 欧美激情视频一区二区三区不卡| 永久555www成人免费| 亚洲aⅴ日韩av电影在线观看| 国产在线观看不卡| 欧美猛男性生活免费| 亚洲三级av在线| 欧美精品情趣视频| 欧日韩在线观看| 91在线观看免费观看| 欧美一级片在线播放| 日韩电影在线观看免费| 国产精品三级久久久久久电影| 亚洲精品中文字幕av| 欧美在线亚洲在线| 国产精品一区二区av影院萌芽| 亚洲三级黄色在线观看| 91精品在线观看视频| 国产精品第七十二页| 日韩欧美国产成人| 欧美激情综合色综合啪啪五月| 亚洲人精品午夜在线观看| 欧美日韩亚洲国产一区| 在线观看91久久久久久| 国产欧美日韩专区发布| 国内揄拍国内精品少妇国语| 欧美激情一区二区三级高清视频| 亚洲精品福利在线观看| 欧美日韩在线视频一区二区| 欧美日韩在线观看视频| 午夜精品一区二区三区在线| 精品一区二区三区四区| 成人免费午夜电影| 欧美性猛交99久久久久99按摩| 国产一区二区三区在线播放免费观看| 色综合久久天天综线观看| 国产日韩在线免费| 国产mv免费观看入口亚洲| 亚洲高清免费观看高清完整版| 欧美日韩国产中文字幕| 日韩精品黄色网| 黑人巨大精品欧美一区免费视频| 日韩在线视频国产| 2018中文字幕一区二区三区| 欧美在线视频观看| 国产成人精品a视频一区www| 2019av中文字幕| 国产欧美日韩精品在线观看| 日韩欧美在线观看视频| 国产精品99久久99久久久二8| 成人欧美一区二区三区在线| 久久精品亚洲国产| 国产黑人绿帽在线第一区| 欧美肥老太性生活视频| 精品小视频在线| 国模私拍一区二区三区| 日韩日本欧美亚洲| 国产精品免费观看在线| 亚洲精品国产精品国自产观看浪潮| 亚洲午夜激情免费视频| 精品中文字幕在线2019| 成人性教育视频在线观看| 欧美日韩国产激情| 7m第一福利500精品视频| 亚洲欧美中文字幕在线一区| 国产又爽又黄的激情精品视频|