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

ASP.NET 2.0數據教程:創建BLL類

開發 后端
本文主要介紹了asp.net 2.0數據操作中的業務邏輯層的第一步:創建BLL類。

在ASP.NET 2.0中,我們其實可以將業務邏輯層(Business Logic Layer,以下簡稱BLL)看作是在數據訪問層和表示層之間進行數據交換的橋梁,在這個章節中,我們將討論一下如何將這些業務規則集成到一個BLL中。需要說明的是,在一個實際的應用程序中,BLL都是以類庫(Class Library)的形式來實現的,不過為了簡化工程的結構,在本教程中我們將BLL實現為App_Code文件夾中的一系列的類。圖一向我們展示了表示層、BLL以及DAL三者之間的結構關系。

BLL將表示層與DAL隔開了,并且加入了業務規則 

圖一:BLL將表示層與DAL隔開了,并且加入了業務規則

***步:創建BLL類

我們的BLL由4個類組成,每一個BLL類都對應DAL中的一個TableAdapter,它們都從各自的TableAdapter中得到讀取、插入、修改以及刪除等方法以應用合適的業務規則。

為了更加清晰的區分DAL和BLL的類,我們在App_Code文件夾中建立兩個子文件夾,分別命名為DAL和BLL。你僅僅需要在解決方案瀏覽器(Solution Explorer)中右鍵點擊App_Code文件夾,并選擇新建文件夾(New Folder),就可以創建新的子文件夾了。建好了這兩個文件夾之后,把***節中所創建的類型化數據集(Typed DataSet)移到DAL文件夾中。

然后,在BLL文件夾中創建4個類文件。同樣,你僅僅需要在解決方案瀏覽器(Solution Explorer)中右鍵點擊BLL文件夾,并選擇新建項目(New Item),然后在彈出的對話框中選擇類模板(Class template)就可以創建新的類文件了。將這四個文件分別命名為ProductsBLL、CategoriesBLL、SuppliersBLL以及EmployeesBLL。

在BLL文件夾中添加4個新的類 

圖二:在BLL文件夾中添加4個新的類

接下來,讓我們來給這些新建的類加上一些方法,簡單的將***節中的TableAdapter中的那些方法包裝起來就行了。現在,這些方法將只能直接使用DAL中的那些方法,我們等會再來給他們加上一些業務邏輯。

注意:如果你使用的是Visual Studio 標準版或以上版本(也就是說,你不是用的Visual Web Developer),那么你還可以使用Class Designer來可視化的設計你的類。你可以在Class Designer Blog上得到關于Visual Studio的這項新功能的詳細信息。

在ProductsBLL類中,我們一共需要為其添加7個方法:

l         GetProducts() – 返回所有的產品

l         GetProductByProductID(productID) – 返回指定ProductID的產品

l         GetProductsByCategoryID(categoryID) –返回指定分類的產品

l         GetProductsBySupplier(supplierID) –返回指定供應商的產品

l         AddProduct(productName, supplierID, categoryID, quantityPerUnit, unitPrice, unitsInStock, unitsOnOrder, reorderLevel, discontinued) – 向數據庫中添加一條產品信息,并返回新添加的產品的ProductID

l         UpdateProduct(productName, supplierID, categoryID, quantityPerUnit, unitPrice, unitsInStock, unitsOnOrder, reorderLevel, discontinued, productID) – 更新一個數據庫中已經存在的產品,如果剛好更新了一條記錄,則返回true,否則返回false

l         DeleteProduct(productID) – 刪除指定ProductID的產品

  1. using System;  
  2. using System.Data;  
  3. using System.Configuration;  
  4. using System.Web;  
  5. using System.Web.Security;  
  6. using System.Web.UI;  
  7. using System.Web.UI.WebControls;  
  8. using System.Web.UI.WebControls.WebParts;  
  9. using System.Web.UI.HtmlControls;  
  10. using NorthwindTableAdapters;  
  11.  
  12. [System.ComponentModel.DataObject]  
  13. public class ProductsBLL  
  14. {  
  15.     private ProductsTableAdapter _productsAdapter = null;  
  16.     protected ProductsTableAdapter Adapter  
  17.     {  
  18.         get {  
  19.             if (_productsAdapter == null)  
  20.                 _productsAdapter = new ProductsTableAdapter();  
  21.  
  22.             return _productsAdapter;   
  23.         }  
  24.     }  
  25.  
  26.  
  27. [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]  
  28.     public Northwind.ProductsDataTable GetProducts()  
  29.     {          
  30.         return Adapter.GetProducts();  
  31.     }  
  32.  
  33.     [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]  
  34.     public Northwind.ProductsDataTable GetProductByProductID(int productID)  
  35.     {  
  36.         return Adapter.GetProductByProductID(productID);  
  37.     }  
  38.  
  39. [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]  
  40.    public Northwind.ProductsDataTable GetProductsByCategoryID(int categoryID)  
  41.     {  
  42.         return Adapter.GetProductsByCategoryID(categoryID);  
  43.    }  
  44.  
  45. [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]  
  46.     public Northwind.ProductsDataTable GetProductsBySupplierID(int supplierID)  
  47.     {  
  48.         return Adapter.GetProductsBySupplierID(supplierID);  
  49.     }  
  50.     [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert, true)]  
  51.     public bool AddProduct(string productName, int? supplierID, int? categoryID, string quantityPerUnit,   
  52.                           decimal? unitPrice, short? unitsInStock, short? unitsOnOrder, short? reorderLevel,   
  53.                           bool discontinued)  
  54.     {  
  55.         // 新建一個ProductRow實例  
  56.         Northwind.ProductsDataTable products = new Northwind.ProductsDataTable();  
  57.         Northwind.ProductsRow product = products.NewProductsRow();  
  58.  
  59.         product.ProductName = productName;  
  60.         if (supplierID == null) product.SetSupplierIDNull(); else product.SupplierID = supplierID.Value;  
  61.         if (categoryID == null) product.SetCategoryIDNull(); else product.CategoryID = categoryID.Value;  
  62.         if (quantityPerUnit == null) product.SetQuantityPerUnitNull(); else product.QuantityPerUnit = quantityPerUnit;  
  63.         if (unitPrice == null) product.SetUnitPriceNull(); else product.UnitPrice = unitPrice.Value;  
  64.         if (unitsInStock == null) product.SetUnitsInStockNull(); else product.UnitsInStock = unitsInStock.Value;  
  65.         if (unitsOnOrder == null) product.SetUnitsOnOrderNull(); else product.UnitsOnOrder = unitsOnOrder.Value;  
  66.         if (reorderLevel == null) product.SetReorderLevelNull(); else product.ReorderLevel = reorderLevel.Value;  
  67.         product.Discontinued = discontinued;  
  68.  
  69.         // 添加新產品  
  70.         products.AddProductsRow(product);  
  71.         int rowsAffected = Adapter.Update(products);  
  72.  
  73.         // 如果剛好新增了一條記錄,則返回true,否則返回false  
  74.         return rowsAffected == 1;  
  75.     }  
  76.  
  77.     [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)]  
  78.     public bool UpdateProduct(string productName, int? supplierID, int? categoryID, string quantityPerUnit,  
  79.                               decimal? unitPrice, short? unitsInStock, short? unitsOnOrder, short? reorderLevel,  
  80.                               bool discontinued, int productID)  
  81.     {  
  82.         Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);  
  83.         if (products.Count == 0)  
  84.             // 沒有找到匹配的記錄,返回false  
  85.             return false;  
  86.  
  87.         Northwind.ProductsRow product = products[0];  
  88.  
  89.         product.ProductName = productName;  
  90.         if (supplierID == null) product.SetSupplierIDNull(); else product.SupplierID = supplierID.Value;  
  91.         if (categoryID == null) product.SetCategoryIDNull(); else product.CategoryID = categoryID.Value;  
  92.         if (quantityPerUnit == null) product.SetQuantityPerUnitNull(); else product.QuantityPerUnit = quantityPerUnit;  
  93.         if (unitPrice == null) product.SetUnitPriceNull(); else product.UnitPrice = unitPrice.Value;  
  94.         if (unitsInStock == null) product.SetUnitsInStockNull(); else product.UnitsInStock = unitsInStock.Value;  
  95.         if (unitsOnOrder == null) product.SetUnitsOnOrderNull(); else product.UnitsOnOrder = unitsOnOrder.Value;  
  96.         if (reorderLevel == null) product.SetReorderLevelNull(); else product.ReorderLevel = reorderLevel.Value;  
  97.         product.Discontinued = discontinued;  
  98.  
  99.         // 更新產品記錄  
  100.         int rowsAffected = Adapter.Update(product);  
  101.  
  102.         // 如果剛好更新了一條記錄,則返回true,否則返回false  
  103.        return rowsAffected == 1;  
  104.     }  
  105.  
  106.     [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, true)]  
  107.     public bool DeleteProduct(int productID)  
  108.     {  
  109.         int rowsAffected = Adapter.Delete(productID);  
  110.  
  111.         // 如果剛好刪除了一條記錄,則返回true,否則返回false  
  112.         return rowsAffected == 1;  
  113.     }  

GetProducts、GetProductByProductID、GetProductsByCategoryID以及 GetProductBySuppliersID等方法都僅僅是簡簡單單的直接調用DAL中的方法來返回數據。不過在有的情況下,我們還可能需要給它們實現一些業務規則(比如說授權規則,不同的用戶或不用角色應該可以看到不同的數據),現在我們簡單的將它們做成這樣就可以了。那么,對于這些方法來說,BLL僅僅是作為表示層與DAL之間的代理。

AddProduct和UpdateProduct這兩個方法都使用參數中的那些產品信息去添加或是更新一條產品記錄。由于Product表中有許多字段都允許空值(CategoryID、SupplierID、UnitPrice……等等),所以AddProduct和UpdateProduct中相應的參數就使用nullable types。Nullable types是.NET 2.0中新提供的一種用于標明一個值類型是否可以為空的技術。在C#中,你可以在一個允許為空的值類型后面加上一個問號(比如,int? x;)。關于Nullable Types的詳細信息,你可以參考C# Programming Guide。

由于插入、修改和刪除可能不會影響任何行,所以這三種方法均返回一個bool值用于表示操作是否成功。比如說,頁面開發人員使用一個并不存在的ProductID去調用DeleteProduct,很顯然,提交給數據庫的DELETE語句將不會有任何作用,所以DeleteProduct會返回false。

注意:當我們在添加或更新一個產品的詳細信息時,都是接受由產品信息組成的一個標量列表,而不是直接接受一個ProductsRow實例。因為ProductsRow是繼承于ADO.NET的DataRow,而DataRow沒有默認的無參構造函數,為了創建一個ProductsRow的實例,我們必須先創建一個ProductsDataTable的實例,然后調用它的NewProductRow方法(就像我們在AddProduct方法中所做的那樣)。不過,當我在使用ObjectDataSource來插入或更新時,這樣做的缺點就會暴露出來了。簡單的講,ObjectDataSource會試圖為輸入的參數創建一個實例,如果BLL方法希望得到一個ProductsRow,那么ObjectDataSource就將會試圖去創建一個,不過很顯然,這樣的操作一定會失敗,因為沒有一個默認的無參構造函數。這個問題的詳細信息,可以在ASP.NET論壇的以下兩個帖子中找到: Updating ObjectDataSources with Strongly-Typed DataSets、Problem With ObjectDataSource and Strongly-Typed DataSet。

之后,在AddProduct和UpdateProduct中,我們創建了一個ProductsRow實例,并將傳入的參數賦值給它。當給一個DataRow的DataColumns賦值時,各種字段級的有效性驗證都有可能會被觸發。因此,我們應該手工的驗證一下傳入的參數以保證傳遞給BLL方法的數據是有效的。不幸的是,Visual Studio生成的強類型數據集(strongly-typed DataRow)并沒有使用nullable values。要表明DataRow中的一個DataColumn可以接受空值,我們就必須得使用SetColumnNameNull方法。

在UpdateProduct中,我們先使用GetProductByProductID(productID)方法將需要更新的產品信息讀取出來。這樣做好像沒有什么必要,不過我們將在之后的關于并發優化(Optimistic concurrency)的課程中證明這個額外的操作是有它的作用的。并發優化是一種保證兩個用戶同時操作一個數據而不會發生沖突的技術。獲取整條記錄同時也可以使創建一個僅更新DataRow的一部分列的方法更加容易,我們可以在SuppliersBLL類中找到這樣的例子。

***,注意我們在ProductsBLL類上面加上了DataObject 標簽(就是在類聲明語句的上面的[System.ComponentModel.DataObject]),各方法上面還有DataObjectMethodAttribute 標簽。DataObject標簽把這個類標記為可以綁定到一個ObjectDataSource控件,而DataObjectMethodAttribute則說明了這個方法的目的。我們將在后面的教程中看到,ASP.NET 2.0的ObjectDataSource使從一個類中訪問數據更加容易。為了ObjectDataSource向導能夠對現有的類進行合適的篩選,在類列表中默認僅顯示標記為DataObject的類。當然,其實ProductsBLL類就算沒有這個標簽也可以工作,但是加上它可以使我們在ObjectDataSource向導中的操作更加輕松和心情愉快。

添加其他的類

完成了ProductsBLL類之后,我們還要添加一些為categories、suppliers和employees服務的類。讓我們花點時間來創建下面的類,根據上面的例子來做就是了:

·         CategoriesBLL.cs

o        GetCategories()

o        GetCategoryByCategoryID(categoryID)

·         SuppliersBLL.cs

o        GetSuppliers()

o        GetSupplierBySupplierID(supplierID)

o        GetSuppliersByCountry(country)

o        UpdateSupplierAddress(supplierID, address, city, country)

·         EmployeesBLL.cs

o        GetEmployees()

o        GetEmployeeByEmployeeID(employeeID)

o        GetEmployeesByManager(managerID)

SuppliersBLL類中的UpdateSupplierAddress方法是一個值得注意的東西。這個方法提供了一個僅僅更新供應商地址信息的接口。它首先根據指定的SupplierID讀出一個SupplierDataRow(使用GetSupplierBySupplierID方法),設置其關于地址的所有屬性,然后調用SupplierDataTable的Update方法。UpdateSupplierAddress方法的代碼如下所示:

  1. [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)]  
  2. public bool UpdateSupplierAddress(int supplierID, string address, string city, string country)  
  3. {  
  4.     Northwind.SuppliersDataTable suppliers = Adapter.GetSupplierBySupplierID(supplierID);  
  5.     if (suppliers.Count == 0)  
  6.         // 沒有找到匹配的項,返回false  
  7.         return false;  
  8.     else 
  9.     {  
  10.         Northwind.SuppliersRow supplier = suppliers[0];  
  11.  
  12.         if (address == null) supplier.SetAddressNull(); else supplier.Address = address;  
  13.         if (city == null) supplier.SetCityNull(); else supplier.City = city;  
  14.         if (country == null) supplier.SetCountryNull(); else supplier.Country = country;  
  15.  
  16.         // 更新供應商的關于地址的信息  
  17.         int rowsAffected = Adapter.Update(supplier);  
  18.  
  19.         // 如果剛好更新了一條記錄,則返回true,否則返回false  
  20.         return rowsAffected == 1;  
  21.     }  

【編輯推薦】

  1. 如何在IIS6.0中部署asp.net mvc程序
  2. 用Winform傻瓜式搭建asp.net mvc框架
  3. ASP.NET Session失效的編程思路
  4. ASP.NET Session 狀態的存儲
  5. 了解ASP.NET Web應用程序模型

 

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

2009-07-24 13:08:03

BLL類ASP.NET 2.0

2009-07-24 13:07:59

BLL類

2009-07-24 16:37:04

創建母版頁asp.net 2.0

2009-07-24 13:25:43

創建數據訪問層

2009-07-24 17:15:52

SiteMapData

2009-07-27 16:09:05

GridView顯示數

2009-07-24 17:08:31

添加站點地圖asp.net

2009-07-27 03:21:00

breadcrumb導

2009-07-27 09:01:44

ObjectDataS

2009-07-27 16:22:54

GridView選擇行

2009-07-29 13:57:53

創建SlideShowASP.NET

2009-07-23 14:25:03

ASP.NET 2.0

2009-07-23 14:43:24

數據源控件ASP.NET 2.0

2009-07-27 09:28:55

TableAdapte

2009-07-27 09:39:04

SelectMetho

2009-07-24 14:15:51

數據訪問層

2009-07-28 14:06:28

ASP.NET 2.0

2009-07-22 17:21:27

ASP.NET 2.0

2009-07-24 16:55:53

添加aspx頁面

2009-07-24 14:02:39

ASP.NET 2.0
點贊
收藏

51CTO技術棧公眾號

亚洲精品欧美日韩专区| 精品区一区二区| 日韩区国产区| 伊人22222| 亚洲精品一区二区在线看| 日韩美女视频一区二区在线观看| 日日碰狠狠添天天爽超碰97| 95在线视频| 99免费精品在线| 国产精品网址在线| 国产精品30p| 久久精品国产www456c0m| 精品国产乱码久久久久久图片| 久久久999视频| 国产传媒在线播放| 久久久精品综合| 高清视频在线观看一区| 日本视频在线观看免费| 综合天天久久| 在线国产精品播放| 亚洲成人av免费在线观看| 成人av在线播放| 欧美性色19p| 欧美日韩视频免费| 美女av在线播放| 久久免费国产精品| 成人91免费视频| 夜夜爽8888| 丝袜国产日韩另类美女| 高清一区二区三区四区五区| 99自拍视频在线| 亚洲黄色录像| 亚洲精品电影网| 日韩精品视频网址| 农村妇女一区二区| 色婷婷综合久色| 国产乱子伦农村叉叉叉| 蜜臀av在线播放| 亚洲欧洲制服丝袜| 一本色道久久综合亚洲二区三区 | 性高湖久久久久久久久| 欧美成年人视频| 国产精品国产精品88| 日韩精品首页| 一本大道亚洲视频| 久久亚洲AV无码专区成人国产| 欧美调教在线| 亚洲国产欧美一区| 在线免费观看a级片| 第四色在线一区二区| 精品久久久网站| 日韩女优在线视频| 88久久精品| 欧美成人福利视频| 成人做爰69片免费| 成人偷拍自拍| 精品视频在线观看日韩| 波多野结衣 在线| 要久久电视剧全集免费| 亚洲社区在线观看| 日韩av片在线| 99久久.com| 蜜臀久久99精品久久久久久宅男| 在线观看黄网址| 欧美在线二区| 久久欧美在线电影| 国产精品男女视频| 日韩精品一级中文字幕精品视频免费观看 | 亚洲欧美黄色片| 综合在线影院| 欧美无人高清视频在线观看| gai在线观看免费高清| 国产精品视频首页| 精品日韩在线观看| 中文字幕人妻一区二区| 久久高清免费| 久久久久久亚洲精品中文字幕| 国产尤物在线视频| 日本vs亚洲vs韩国一区三区二区| 成人黄在线观看| 亚洲第一精品网站| 久久色.com| 91xxx视频| caoporn视频在线| 91成人免费电影| 亚洲理论中文字幕| 久久精品色综合| 中文欧美在线视频| 久久国产精品二区| 日韩成人av影视| av一区观看| 国产黄在线观看免费观看不卡| 中文字幕在线观看不卡| 国产一级爱c视频| 91九色综合| 亚洲成人xxx| 欧美图片一区二区| 91成人网在线观看| 欧美在线视频免费观看| 一级黄色片在线播放| eeuss国产一区二区三区| 视频在线观看成人| 国产美女情趣调教h一区二区| 日韩欧美大尺度| 韩国三级hd中文字幕有哪些| 国产日韩视频在线| 色综合久久久久久中文网| 无码视频一区二区三区| 国产成人av一区二区三区在线 | 91香蕉电影院| 欧洲毛片在线| 一区二区三区不卡视频在线观看| 欧美一级黄色影院| aaa国产精品视频| 中文字幕免费精品一区高清| 日本免费观看视| 国产精品一区二区久久不卡| 神马一区二区影院| 在线最新版中文在线| 日韩欧美在线不卡| 亚洲av毛片基地| 久久精品电影| 久久久久久精| 久热在线观看视频| 欧美zozozo| 国产午夜手机精彩视频| 美女国产一区二区三区| 免费成人在线观看av| av伦理在线| 日韩一级视频免费观看在线| 免费成人深夜蜜桃视频| 日韩高清欧美激情| 久久亚洲国产精品日日av夜夜| 性欧美ⅴideo另类hd| 欧美挠脚心视频网站| 少妇愉情理伦三级| 久久高清一区| 欧美二级三级| 自拍视频在线看| 亚洲精品有码在线| 国产精品999在线观看| 成人的网站免费观看| 99久久99久久精品| 亚洲精品一二三**| 九九热精品在线| 精品人妻少妇嫩草av无码专区| 亚洲三级在线看| 日韩在线一区视频| 亚洲精品a级片| 91免费电影网站| 成人免费网址| 日韩久久久精品| 国产精品成人免费一区二区视频| 成人禁用看黄a在线| cao在线观看| 亚洲美女久久| 国产精品久久久久久av下载红粉 | 一本色道久久综合熟妇| 国产精品网站导航| 中文字幕视频三区| 欧美日韩伊人| 久草一区二区| 韩日精品一区| 粉嫩欧美一区二区三区高清影视| 亚洲精品国精品久久99热一| 欧美日韩中文视频| proumb性欧美在线观看| 91精品91久久久中77777老牛| 综合亚洲自拍| 成人h片在线播放免费网站| 成人看av片| 亚洲国产精品字幕| 五月婷婷六月婷婷| 国产精品无码永久免费888| 国产资源中文字幕| 国产日本精品| 亚洲精品无人区| 久久在线观看| 日本道色综合久久影院| 求av网址在线观看| 亚洲а∨天堂久久精品喷水| 精品免费囯产一区二区三区| 国产精品国产三级国产普通话蜜臀 | 无遮挡亚洲一区| 国产乱码精品一区二区三区亚洲人 | 成人做爰69片免网站| 国产裸体歌舞团一区二区| 老太脱裤子让老头玩xxxxx| 欧美日韩国产高清电影| 亚洲在线视频观看| 竹内纱里奈兽皇系列在线观看| 日韩一级黄色av| 天天干天天干天天干| 欧美日韩免费在线视频| 国产无套内射又大又猛又粗又爽| 久久精品视频在线免费观看| 色姑娘综合天天| 久久国产精品久久w女人spa| 免费成人进口网站| 尤物tv在线精品| 亚洲综合日韩在线| 亚州一区二区三区| 欧美精品福利在线| 日韩黄色影院| 日韩久久免费电影| 国产黄色片av| 欧美日韩视频在线第一区| 欧美日韩综合在线观看| 亚洲精品视频一区| 黄色免费一级视频| 91久色porny| 日韩大尺度视频| 理论片日本一区| 已婚少妇美妙人妻系列| 亚洲经典视频在线观看| 日本女人高潮视频| 欧洲三级视频| 欧美一区二区三区在线播放 | 精品美女一区二区| 依依成人在线视频| 91精品办公室少妇高潮对白| 中文字幕一区二区三区手机版| 最近日韩中文字幕| 日本人亚洲人jjzzjjz| 久久久一区二区三区捆绑**| 影音先锋资源av| 国产精品一二一区| 一起操在线视频| 免费高清视频精品| 免费看a级黄色片| 久久成人免费| 日本中文字幕片| 亚洲精品四区| 久久国产精品视频在线观看| 国产字幕视频一区二区| 国产欧美久久久久| 欧美日韩 国产精品| 国产精品h视频| 天天揉久久久久亚洲精品| 亚洲一区二区精品在线观看| 黄色不卡一区| 色噜噜一区二区| 国产一区二区三区不卡视频网站| 牛人盗摄一区二区三区视频| 九九视频精品全部免费播放| 另类欧美小说| 少妇精品久久久| 青青影院一区二区三区四区| 残酷重口调教一区二区| 亚洲精品乱码视频| 欧美gayvideo| 国产精品av免费| 国产精品v日韩精品v欧美精品网站| 亚洲国产精品女人| 国产精品theporn| 国产成人精品视频免费看| 老司机免费视频久久| 国产精品igao| 精品一区二区三区久久| 国产一级二级av| 99精品国产视频| 国产又黄又粗视频| 中文字幕一区二区三中文字幕| 日韩a级片在线观看| 亚洲国产日产av| 天天综合网入口| 欧美自拍丝袜亚洲| 国产麻豆91视频| 精品国产一区二区三区久久影院| 五月天婷婷在线播放| 亚洲天堂成人在线视频| 中文字幕在线观看日本| 欧美乱大交xxxxx| 久久久久亚洲av片无码| 久久蜜桃av| 日本五级黄色片| 亚洲欧美日韩一区在线观看| 亚洲第一狼人区| 国产91丝袜在线播放0| 一卡二卡三卡四卡| 亚洲视频一区在线| 日韩在线视频免费播放| 欧美亚洲自拍偷拍| 99精品在线看| 亚洲男人天堂2023| 成码无人av片在线观看网站| 韩剧1988免费观看全集| 激情久久99| 精品国产乱码久久久久久88av | 大陆av在线播放| 天堂成人国产精品一区| 九九热视频免费| 久久久久久99精品| 久草视频在线免费看| 在线国产亚洲欧美| 国内精品久久久久久久久久久| 亚洲精品视频网上网址在线观看| 麻豆传媒在线完整视频| 4438全国亚洲精品在线观看视频| 国产精品蜜月aⅴ在线| 激情久久av| 亚洲影视一区二区三区| 国产九九在线视频| 99re热视频精品| 超碰手机在线观看| 欧美亚一区二区| 日韩一区二区三区不卡| 久久精品视频va| 亚洲成av在线| 久久国产手机看片| 欧美韩日精品| 久热精品在线播放| 久久婷婷综合激情| 国产一级免费av| 欧美一区二区视频观看视频| 成人激情电影在线看| 5566日本婷婷色中文字幕97| 1769国产精品视频| 裸体裸乳免费看| 欧美aaaaaa午夜精品| 久久丫精品国产亚洲av不卡| 亚洲在线中文字幕| 国产精品九九九九| 在线日韩第一页| 亚洲私拍视频| 精品久久久三级| 1000部精品久久久久久久久| 国产精品熟女一区二区不卡| 国产精品你懂的在线| 波多野结衣视频观看| 精品丝袜一区二区三区| 僵尸再翻生在线观看| 国产精成人品localhost| 欧美va天堂在线| 在线观看网站黄| 亚洲老妇xxxxxx| 国产三级视频在线播放| 久久久精品在线| 成人噜噜噜噜| 六月婷婷激情网| 国产综合成人久久大片91| 黄色国产在线播放| 欧美日本一道本在线视频| 伊人免费在线| 成人黄色中文字幕| 亚洲精品一区二区妖精| 青娱乐国产精品视频| 中文字幕一区二区三区av| 一级做a爱片性色毛片| 久久精品国产成人精品| 亚洲超碰在线观看| 免费人成在线观看视频播放| 成人一级片网址| 亚洲精品男人天堂| 国产午夜精品一区二区三区| www.久久.com| 亚洲一区二区三区免费看| 国内精品免费**视频| www日韩在线| 精品国产sm最大网站免费看| 爱搞国产精品| 日韩欧美在线观看强乱免费| 精品一区免费av| 欧美日韩在线观看成人| 亚洲第一精品久久忘忧草社区| 蜜桃视频在线观看播放| 污视频在线免费观看一区二区三区| 久久99久久久久久久久久久| 国产女主播喷水高潮网红在线| 欧美日韩一区视频| 色爱综合区网| 欧美二区在线| 韩国成人在线视频| 久久久久久激情| 亚洲人成在线观看| 国产精品亚洲四区在线观看| 蜜臀av色欲a片无码精品一区| 久久久久久久久久久久久久久99| 在线观看视频二区| 欧美激情国内偷拍| 亚洲瘦老头同性70tv| 成人不卡免费视频| 亚洲成a人片综合在线| 国产永久免费高清在线观看视频| 91免费看片网站| 亚洲影视在线| 亚洲色偷偷综合亚洲av伊人| 亚洲成色777777在线观看影院| 亚洲爱爱视频| 亚洲人成无码网站久久99热国产 | 国产精品自拍在线| 伊人手机在线视频| 久久午夜a级毛片| 亚洲免费成人av在线| 日韩欧美色视频| 欧美亚日韩国产aⅴ精品中极品| 男女在线观看视频| 亚洲国产综合自拍| 99久久亚洲一区二区三区青草| 91中文字幕在线播放|