日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

7 天玩转 ASP.NET MVC — 第 6 天

發(fā)布時間:2024/9/20 asp.net 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7 天玩转 ASP.NET MVC — 第 6 天 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 第 1 天

  • 第 2 天

  • 第 3 天

  • 第 4 天

  • 第 5 天

  • 第 6 天

  • 第 7 天

0. 前言

歡迎來到第六天的 MVC 系列學(xué)習(xí)中。希望你在閱讀此篇文章的時候,已經(jīng)學(xué)習(xí)了前五天的內(nèi)容,這也是第六天學(xué)習(xí)的前提條件。

1. Lab 27 — 添加批量上傳選項

在這個實驗中,我們將會創(chuàng)建一個選項,用于從 CSV 文件中上傳多個 Employees。

我們將會做兩件事。
1. 學(xué)會如何運用文件上傳控件。

  • 異步控制器。

  • 第一步:創(chuàng)建 FileUploadViewModel

    在 ViewModels 文件夾下創(chuàng)建一個類,命名為 FileUploadViewModel。

  • publicclassFileUploadViewModel:BaseViewModel

  • {

  • publicHttpPostedFileBase fileUpload {get;set;}

  • }

  • HttpPostedFileBase 將會通過客戶端提供上傳文件的訪問入口。

    第二步:創(chuàng)建 BulkUploadController 和 Index 行為方法

    創(chuàng)建一個新的控制器,命名為 BulkUploadController,以及一個行為方法,命名為 Index。

  • publicclassBulkUploadController:Controller

  • {

  • [HeaderFooterFilter]

  • [AdminFilter]

  • publicActionResultIndex()

  • {

  • returnView(newFileUploadViewModel());

  • }

  • }

  • 正 如你所看見的,Index 行為方法附上了 HeaderFooterFilter 和 AdminFilter 屬性。HeaderFooterFilter 確保了正確了頁眉和頁腳數(shù)據(jù)傳輸?shù)?ViewModel,AdminFilter 限制了 Non-Admin 用戶訪問行為方法。

    第三步:創(chuàng)建上傳視圖

    為上述行為方法創(chuàng)建一個視圖。

    需要注意的是,視圖的名稱應(yīng)該為 Index.cshtml,并且應(yīng)該放置在「~/Views/BulkUpload」文件夾下。

    第四步:設(shè)計上傳視圖

    在視圖中放置如下內(nèi)容。

  • @usingWebApplication1.ViewModels

  • @modelFileUploadViewModel

  • @{

  • Layout="~/Views/Shared/MyLayout.cshtml";

  • }


  • @sectionTitleSection{

  • BulkUpload

  • }

  • @sectionContentBody{

  • <div>

  • <a href="/Employee/Index">Back</a>

  • <form action="/BulkUpload/Upload" method="post" enctype="multipart/form-data">

  • SelectFile:<input type="file" name="fileUpload" value=""/>

  • <input type="submit" name="name" value="Upload"/>

  • </form>

  • </div>

  • }

  • 正如你所看見的,在 FileUploadViewModel 中,屬性的名稱和 input[type="file"] 的名稱是一樣的,都是「FileUpload」。我們在 Model Binder 實驗中已經(jīng)講述了名稱屬性的重要性。

    注意:在 Form 標(biāo)簽中,有一個額外的指定加密屬性,我們將會在實驗結(jié)尾處討論它。

    第五步:創(chuàng)建業(yè)務(wù)層上傳方法

    在 EmployeeBusinessLayer 中創(chuàng)建一個新的方法,命名為 UploadEmployees。

  • publicvoidUploadEmployees(List<Employee> employees)

  • {

  • SalesERPDAL salesDal =newSalesERPDAL();

  • salesDal.Employees.AddRange(employees);

  • salesDal.SaveChanges();

  • }

  • 第六步:創(chuàng)建上傳行為方法

    在 BulkUploadController 中創(chuàng)建一個新的行為方法,命名為 Upload。

  • [AdminFilter]

  • publicActionResultUpload(FileUploadViewModel model)

  • {

  • List<Employee> employees =GetEmployees(model);

  • EmployeeBusinessLayer bal =newEmployeeBusinessLayer();

  • bal.UploadEmployees(employees);

  • returnRedirectToAction("Index","Employee");

  • }


  • privateList<Employee>GetEmployees(FileUploadViewModel model)

  • {

  • List<Employee> employees =newList<Employee>();

  • StreamReader csvreader =newStreamReader(model.fileUpload.InputStream);

  • csvreader.ReadLine();// Assuming first line is header

  • while(!csvreader.EndOfStream)

  • {

  • var line = csvreader.ReadLine();

  • var values = line.Split(',');//Values are comma separated

  • Employee e =newEmployee();

  • e.FirstName= values[0];

  • e.LastName= values[1];

  • e.Salary=int.Parse(values[2]);

  • employees.Add(e);

  • }

  • return employees;

  • }

  • 在 Upload 中附上 AdminFilter 是用于限制 Non-Admin 用戶訪問。

    第七步:為 BulkUpload 創(chuàng)建鏈接

    在「Views/Employee」文件夾下打開 AddNewLink.cshtml 文件,為 BulkUpload 附上鏈接。

  • <ahref="/Employee/AddNew">Add New</a>

  • &nbsp;

  • &nbsp;

  • <ahref="/BulkUpload/Index">BulkUpload</a>

  • 第八步:執(zhí)行并測試

    為測試創(chuàng)建一個簡單的文件

    創(chuàng)建一個簡單的文件如下,然后將其保存在電腦中。

    執(zhí)行并測試

    按下 F5,然后執(zhí)行應(yīng)用。完成登錄操作,然后通過點擊鏈接導(dǎo)航到 BulkUpload 選項。

    選擇一個文件,然后點擊上傳。

    注意:在上述的例子中,我們沒有在視圖中用到任何客戶端或者服務(wù)器端的認(rèn)證。它也許會導(dǎo)致如下的錯誤。

    「Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.」

    為了發(fā)現(xiàn)這個錯誤的確切原因,只需要在異常發(fā)生的時候添加如下的表達式。

    ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors。

    表達式「$exception」呈現(xiàn)了任何從當(dāng)前上下文中拋出的錯誤,即使它沒有被捕獲或者支配到一個變量中。

    Lab 27 的 Q&A

    為什么我們沒有在這里用到認(rèn)證?

    為選項增加客戶端和服務(wù)器端的認(rèn)證將會留給讀者完成,我在這里給出一些暗示。

    • 運用 Data Annotations 來進行服務(wù)器端的認(rèn)證。

    • 你可以運用 Data Annotations 或者實現(xiàn) JQuery Unobtrusive Validation 來實現(xiàn)客戶端認(rèn)證。明顯的是,這一次你需要手動設(shè)置自定義數(shù)據(jù)屬性,因為我們沒有為文件輸入創(chuàng)建 HtmlHelper 方法。

    • 對于客戶端的認(rèn)證,你可以寫一些自定義的 JavaScript,然后通過點擊安全觸發(fā)它。這并不是很難,因為文件輸入是一個輸入控件,值可以通過在 JavaScript 中獲取并認(rèn)證。

    什么是HttpPostedFileBase?

    HttpPostedFileBase 可以通過客戶端提供文件上傳的訪問接口。Model Binder 將會在發(fā)送 Post 請求時更新所有 FileUploadViewModel 類的屬性值?,F(xiàn)在 FileUploadViewModel 里只有一個屬性值,Model Binder 將會通過客戶端來設(shè)置這個屬性值,實現(xiàn)文件上傳。

    提供多個文件輸入控件是否可行?

    答案是肯定的。我們可以通過兩種方式實現(xiàn)它。

  • 創(chuàng) 建多個文件輸入控件。每一個控件都需要有唯一的名字。在 FileUploadViewModel 類中為每個控件創(chuàng)建一個 HttpPostedFileBase 的類型屬性。每一個屬性的名稱應(yīng)該與控件的名稱相匹配。剩下的工作會由 ModelBinder 來處理。

  • 創(chuàng)建多個文件輸入控件。每一個控件都需要有唯一的名字。這次不是創(chuàng)建多個 HttpPostedFileBase 的屬性,而是創(chuàng)建一個類型 List。
    注意:上述的情形對于所有控件都可行。當(dāng)你擁有多個相同名稱的控件時,如果要更新的屬性值是一個簡單參數(shù),Model Binder 將會更新第一個控件的屬性值。如果更新的屬性值是一個 List,Model Binder 會將每一個屬性值設(shè)置到控件中。

  • enctype="multipart/form-data"是用于做什么的?

    這個對知道與否并不重要,但是知道確實會好一點。

    這個屬性指定了編碼類型,在傳輸數(shù)據(jù)時使用。屬性的默認(rèn)值是「application/x-www-form-urlencoded」。

    例如,我們的登錄表單將會隨著 Post 請求向服務(wù)器發(fā)送如下數(shù)據(jù)。

  • POST /Authentication/DoLogin HTTP/1.1

  • Host: localhost:8870

  • Connection: keep-alive

  • Content-Length:44

  • Content-Type: application/x-www-form-urlencoded

  • ...

  • ...

  • UserName=Admin&Passsword=Admin&BtnSubmi=Login

  • 當(dāng) enctype="multipart/form-data"屬性被添加到表單標(biāo)簽時,隨著 Post 請求會發(fā)送到服務(wù)器上。

  • POST /Authentication/DoLogin HTTP/1.1

  • Host: localhost:8870

  • Connection: keep-alive

  • Content-Length:452

  • Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywHxplIF8cR8KNjeJ

  • ...

  • ...

  • ------WebKitFormBoundary7hciuLuSNglCR8WC

  • Content-Disposition: form-data; name="UserName"


  • Admin

  • ------WebKitFormBoundary7hciuLuSNglCR8WC

  • Content-Disposition: form-data; name="Password"


  • Admin

  • ------WebKitFormBoundary7hciuLuSNglCR8WC

  • Content-Disposition: form-data; name="BtnSubmi"


  • Login

  • ------WebKitFormBoundary7hciuLuSNglCR8WC

  • 正如你所看見的,表單以多個部分被發(fā)送。每一個部分都通過 Content-Type 被一條邊界線所分隔,并且每一個部分都包含一個值。

    如果表單標(biāo)簽中包含文件輸入控件時,編碼類型需要設(shè)定為「multipart/form-data」。

    注意:每一次請求發(fā)生時,邊界線會隨機生成。你可能會看到不同的邊界線。

    為什么我們不總是將 EncTyp 設(shè)置為「multipart/form-data」?

    當(dāng) EncTyp 被設(shè)置為「multipart/form-data」,它將會做兩件事,Post 數(shù)據(jù)以及上傳文件。這就是為什么我們不總是將其設(shè)置為「multipart/form-data」。

    答案就是,這樣會增加請求的總體大小。請求的大小越大,意味著性能越差。因為最佳實踐應(yīng)該是將其設(shè)置為默認(rèn)的值,即「application/x-www-form-urlencoded」。

    為什么我們需要創(chuàng)建 ViewModel?

    在我們的視圖中有一個控件。我們可以通過直接向 HttpPostedFileBase 類型增加一個參數(shù)來實現(xiàn)同樣的結(jié)果,這里我們需要在上傳方法中命名為 「fileUpload」,而不是創(chuàng)建一個單獨的 ViewModel。代碼如下所示。

  • publicActionResultUpload(HttpPostedFileBase fileUpload)

  • {

  • }

  • 創(chuàng)建 ViewModel 是最佳實踐。Controller 應(yīng)該總是向視圖發(fā)送以 ViewModel 為格式的數(shù)據(jù),并且來自視圖的數(shù)據(jù)應(yīng)該以 ViewModel 發(fā)送給 Controller。

    2. 上述解決方案的問題

    你是否想知道,當(dāng)你發(fā)送一個請求時,如何獲得響應(yīng)的?

    現(xiàn)在不要去說,是通過行為方法接到請求然后怎樣怎樣的。盡管這是正確的答案,我仍然期望一些不同的答案。我的問題是在最開始的時候發(fā)生了什么。

    一個簡單的編程規(guī)則,程序中所有都通過線程執(zhí)行,盡管是請求。

    在 Web 服務(wù)器上的 ASP.NET,.NET Framework 維護著線程池。每一次請求發(fā)送到 Web 服務(wù)器上時,就會把一個線程池中一個空閑的線程分配給服務(wù)器,用于處理請求。這個線程被稱為 Worker 線程。

    Worker 線程在請求正常處理的過程中處于阻塞狀態(tài),并且不能處理其它請求。

    現(xiàn) 在來假設(shè)一種場景,一個應(yīng)用接收到了很多請求,并且每個請求都會花費許多時間來處理進程。在這種情形下,沒有 Worker 線程可用于服務(wù)器請求,所以當(dāng)新的請求想要獲取該線程進行處理狀態(tài)時,我們可能需要在這時候終止它。這個我們稱之為 Thread Starvation(線程饑餓)。

    在我們的例子樣本文件中,只存在了兩個雇員記錄,而在真實場景中,可能存在成千上萬的記錄,這意味著請求也許會花費大量時間來完成進程。這樣會導(dǎo)致線程饑餓。

    解決方案

    迄今為止我們所討論的請求都是同步請求類型。

    如果客戶端發(fā)出的是異步請求,而不是同步請求,那么線程饑餓的問題就解決了。

    • 在異步請求的情形下,請求將會從線程池分配中獲得通常的 Worker 線程,用于服務(wù)請求。

    • Worker 線程將會初始化異步操作,然后返回線程池來服務(wù)其它請求。異步操作將會繼續(xù)被 CLR 線程處理。

    • 現(xiàn)在的問題是,CLR 線程不能返回響應(yīng),所以一旦當(dāng)完成異步操作后,它就會通知 ASP.NET。

    • Web 服務(wù)器將會再一次從線程池中得到 Worker 線程,用于處理剩余的請求和響應(yīng)。

    在上述的完整的場景中,兩個 Worker 線程從線程池中獲取。這兩個 Worker 線程也許是同一個,也許不是。

    在我們的例子中,文件讀取是通過 I/O 操作的,這個操作不需要 Worker 線程來處理。所以最好是將同步請求轉(zhuǎn)換為異步請求。

    異步請求會提升響應(yīng)時間嗎?

    答案是否定的。響應(yīng)時間是相同的。這里線程將會被釋放,用于服務(wù)其它請求。

    3. Lab 28 — 解決線程饑餓問題

    在 ASP.NET MVC 中,我們可以通過轉(zhuǎn)換同步行為方法到異步行為方法,來將同步請求轉(zhuǎn)換為異步請求。

    第一步:創(chuàng)建異步控制器

    將 UploadController 的基類改為AsynController。

  • publicclassBulkUploadController:AsyncController

  • {

  • 第二步:轉(zhuǎn)換同步行為方法到異步行為方法

    通過關(guān)鍵字,「async」和「await」,可以很容易做這件事。

  • [AdminFilter]

  • public async Task<ActionResult>Upload(FileUploadViewModel model)

  • {

  • int t1 =Thread.CurrentThread.ManagedThreadId;

  • List<Employee> employees = await Task.Factory.StartNew<List<Employee>>

  • (()=>GetEmployees(model));

  • int t2 =Thread.CurrentThread.ManagedThreadId;

  • EmployeeBusinessLayer bal =newEmployeeBusinessLayer();

  • bal.UploadEmployees(employees);

  • returnRedirectToAction("Index","Employee");

  • }

  • 正如你所看見的,我們在行為方法的開始和結(jié)束的地方將線程 ID 存儲在變量中。

    現(xiàn)在讓我理解下代碼。

    • 當(dāng)客戶端點擊上傳按鈕時,一個新的請求將被發(fā)送到服務(wù)器。

    • Webserver 從線程池中獲取一個 Worker 線程,然后將其分配給請求用于服務(wù)。

    • Worker 線程使得行為方法用于執(zhí)行。

    • Worker 方法通過 Task.Factory.StartNew 方法執(zhí)行異步操作。

    • 正如你所看見的,行為方法通過關(guān)鍵字 Async被標(biāo)記為異步的,這將會確保一旦異步方法操作開始執(zhí)行,Worker 線程就會得到釋放。這個時候邏輯的異步操作將會通過獨立的 CLR 線程繼續(xù)在后臺執(zhí)行。

    • 現(xiàn)在異步操作調(diào)用將被標(biāo)記為 Await 關(guān)鍵字。這將會確保接下來的代碼行不會被執(zhí)行,除非異步操作完成。

    • 一旦異步操作完成了,接下來的行為方法中的代碼就需要被執(zhí)行。因此又要需要一個 Worker 線程。因此 Webserver 將會從線程池中取出一個空閑線程,然后將其分配給剩余的請求用于服務(wù),并返回響應(yīng)。

    第三步:執(zhí)行并測試

    執(zhí)行應(yīng)用。導(dǎo)航到 BulkUpload 選項。

    在你做任何操作之前,先導(dǎo)航到代碼,然后在最后一行代碼中打個斷點。

    現(xiàn)在選擇一個簡單的文件,然后點擊 Upload。

    正如你所看見的,在方法的開始和結(jié)束時,線程 ID 是不同的。輸出的結(jié)果和之前的實驗結(jié)果一樣。

    4. Lab 29 — 異常處理 — 呈現(xiàn)自定義錯誤頁面

    如果一個項目沒有正確的異常處理,就不能算是一個完整的項目。

    迄今為止,我們討論過 ASP.NET MVC 中的兩個過濾器,即 Action 過濾器和 Authentication 過濾器?,F(xiàn)在是時候討論第三個過濾器了,即 Exception 過濾器。

    什么是 Exception 過濾器?

    Exception 過濾器的使用方式同其它過濾器一樣。我們將以屬性的方式運用。

    運用 Exception 過濾器的步驟。

    • 使它們可用

    • 將它們作為行為方法或者控制器的屬性。我們也可以將它們應(yīng)用到 Global 級別。

    它們是用來做什么的?

    一旦在行為方法內(nèi)部發(fā)生異常時,Exception 過濾器就將會控制執(zhí)行并開始自動執(zhí)行其內(nèi)部的代碼。

    是否存在自動的 Exception 過濾器?

    ASP.NET MVC 提供給我們一個已經(jīng)編寫好的 Exception 過濾器,稱作 HandleError。

    正 如我們之前所說的,當(dāng)行為方法中,一旦異常發(fā)生,過濾器就將被執(zhí)行。這個過濾器將會在「~/Views/[current controller]」或者「~/Views/Shared」文件夾內(nèi)發(fā)現(xiàn)一個名稱為「Error」的視圖,為這個視圖創(chuàng)建一個 ViewResult,然后返回響應(yīng)。

    讓我們看一個 Demo,用于更好地理解。在項目的實驗最后,我們將會實現(xiàn) BulkUpload 選項?,F(xiàn)在存在著較高的輸入文件的錯誤可能性。

    第一步:創(chuàng)建一個簡單的帶有錯誤的 Upload 文件

    創(chuàng)建一個簡單的上傳文件,就像之前一樣。但是這次,文件中包含一些非法值。

    正如你所看見的,Salary 是非法的。

    第二步:執(zhí)行并測試應(yīng)用

    按下 F5,執(zhí)行應(yīng)用。導(dǎo)航到 Bulk Upload 選項,選擇上述的文件,然后點擊 Upload。

    第三步:使異常過濾器可用

    自定義異常開啟后,異常過濾器也被開啟。為了開啟自定義異常,打開 Web.config 文件,然后導(dǎo)航到 System.Web 區(qū)域,在該區(qū)域下增加自定義錯誤,如下所示。

  • <system.web>

  • <customErrorsmode="On"></customErrors>

  • 第四步:創(chuàng)建錯誤視圖

    在「~Views/Shared」文件夾下,可以看到一個文件,即「Error.cshtml」。這個文件作為 MVC 樣本文件的一部分在開始的時候被創(chuàng)建。如果沒有被創(chuàng)建,就手動創(chuàng)建。

  • @{

  • Layout=null;

  • }


  • <!DOCTYPE html>

  • <html>

  • <head>

  • <meta name="viewport" content="width=device-width"/>

  • <title>Error</title>

  • </head>

  • <body>

  • <hgroup>

  • <h1>Error.</h1>

  • <h2>An error occurred while processing your request.</h2>

  • </hgroup>

  • </body>

  • </html>

  • 第五步:附上 Exception 過濾器

    正如我們之前所討論的,一旦我們使異常過濾器可用,我們將會把它綁定到一個行為方法或者控制器中。

    好的消息是我們無需手動附上過濾器。

    在 App_Start 文件夾下打開 FilterConfig.cs 文件。在 RegisterGlobalFilter 方法下,你可以看到 HandleError 過濾器已經(jīng)被附上 Global 級別。

  • publicstaticvoidRegisterGlobalFilters(GlobalFilterCollection filters)

  • {

  • filters.Add(newHandleErrorAttribute());//ExceptionFilter

  • filters.Add(newAuthorizeAttribute());

  • }

  • 如果需要移除 Global 過濾器,將會被附上方法或者控制器級別。

  • [AdminFilter]

  • [HandleError]

  • public async Task<ActionResult>Upload(FileUploadViewModel model)

  • {

  • 但是不建議這么做,最好還是應(yīng)用 Global 級別。

    第六步:執(zhí)行并測試

    像之前的方式一樣,讓我們來看一下應(yīng)用的測試結(jié)果。

    第七步:在視圖中展示錯誤信息

    為了達到這個目的,我們需要將錯誤視圖轉(zhuǎn)換為 HandleErrorInfo 類的強類型視圖,然后在視圖中展示錯誤信息。

  • @modelHandleErrorInfo

  • @{

  • Layout=null;

  • }


  • <!DOCTYPE html>

  • <html>

  • <head>

  • <meta name="viewport" content="width=device-width"/>

  • <title>Error</title>

  • </head>

  • <body>

  • <hgroup>

  • <h1>Error.</h1>

  • <h2>An error occurred while processing your request.</h2>

  • </hgroup>

  • ErrorMessage:@Model.Exception.Message<br />

  • Controller:@Model.ControllerName<br />

  • Action:@Model.ActionName

  • </body>

  • </html>

  • 第八步:執(zhí)行并測試

    這次測試結(jié)果,我們將會得到如下的錯誤視圖。

    我們是否錯失了什么?

    Handle Error 屬性確保了無論何時行為方法發(fā)生異常時,自定義視圖都會被呈現(xiàn)。但是僅限于控制器和行為方法。它不會處理「Resource not found」錯誤。

    執(zhí)行應(yīng)用,輸入一些古怪的 URL。

    第九步:創(chuàng)建 ErrorController

    在 Controller 文件夾下創(chuàng)建一個名為 ErrorController 的控制器,然后創(chuàng)建一個行為方法,命名為 Index。

  • publicclassErrorController:Controller

  • {

  • // GET: Error

  • publicActionResultIndex()

  • {

  • Exception e=newException("Invalid Controller or/and Action Name");

  • HandleErrorInfo eInfo =newHandleErrorInfo(e,"Unknown","Unknown");

  • returnView("Error", eInfo);

  • }

  • }

  • HandleErrorInfo 控制器擁有三個參數(shù),即異常對象,控制器名稱和行為方法名稱。

    第十步:在非法的 URL 中呈現(xiàn)自定義錯誤視圖

    在 Web.config 中設(shè)定「Resource not found error」定義。

  • <system.web>

  • <customErrorsmode="On">

  • <errorstatusCode="404"redirect="~/Error/Index"/>

  • </customErrors>

  • 第十一步:使所有人可訪問 ErrorController

    在 ErrorController 中應(yīng)用 AllowAnonymous 屬性,Index 方法不應(yīng)該被綁定到一個有權(quán)限的用戶。因為用戶可能在登錄前就輸入了非法的 URL。

  • [AllowAnonymous]

  • publicclassErrorController:Controller

  • {

  • 第十二步:執(zhí)行并測試

    執(zhí)行應(yīng)用程序,然后在瀏覽器地址欄輸入一些非法的 URL。

    Lab 29 的 Q&A

    可以改變視圖的名稱嗎?

    答案是肯定的,保持視圖名稱為「Error」不是總是必須的。

    在這種情形下,當(dāng)附上 HandleError 過濾器時,我們需要指定視圖的名稱。

    [HandleError(View="MyError")]

    或者是

  • filters.Add(newHandleErrorAttribute()

  • {

  • View="MyError"

  • });

  • 對于不同的異常,獲取不同的錯誤視圖,是否可行?

    答案是肯定的,這是可行的。在這種情形下,我們需要應(yīng)用 Handle Error 過濾器多次。

  • [HandleError(View="DivideError",ExceptionType=typeof(DivideByZeroException))]

  • [HandleError(View="NotFiniteError",ExceptionType=typeof(NotFiniteNumberException))]

  • [HandleError]

  • 或者是

  • filters.Add(newHandleErrorAttribute()

  • {

  • ExceptionType=typeof(DivideByZeroException),

  • View="DivideError"

  • });

  • filters.Add(newHandleErrorAttribute()

  • {

  • ExceptionType=typeof(NotFiniteNumberException),

  • View="NotFiniteError"

  • });

  • filters.Add(newHandleErrorAttribute());

  • 在上述的例子中,我們增加了三個 Handle Error 過濾器。前兩個為指定的異常,而后一個更加通用一些,它將會為所有其它異常展示錯誤視圖。

    5. 理解上述實驗的局限

    上述實驗存在唯一的局限,便是我們沒有將異常日志輸出。

    6. Lab 30 — 異常處理 — 異常日志

    第一步:創(chuàng)建 Logger 類

    在項目的根目錄下創(chuàng)建一個新的文件夾,稱為 Logger。

    在 Logger 文件夾下創(chuàng)建一個類,命名為 FileLogger。

  • namespaceWebApplication1.Logger

  • {

  • publicclassFileLogger

  • {

  • publicvoidLogException(Exception e)

  • {

  • File.WriteAllLines("C://Error//"+DateTime.Now.ToString("dd-MM-yyyy mm hh ss")+".txt",

  • newstring[]

  • {

  • "Message:"+e.Message,

  • "Stacktrace:"+e.StackTrace

  • });

  • }

  • }

  • }

  • 第二步:創(chuàng)建 EmployeeExceptionFilter 類

    在 Filters 文件夾下創(chuàng)建一個新的類,命名為 EmployeeExceptionFilter。

  • namespaceWebApplication1.Filters

  • {

  • publicclassEmployeeExceptionFilter

  • {

  • }

  • }

  • 第三步:擴展 Handle Error 用于實現(xiàn)日志記錄

    讓 EmployeeExceptionFilter 類繼承 HandleErrorAttribute 類,然后重寫 OnException 方法。

  • publicclassEmployeeExceptionFilter:HandleErrorAttribute

  • {

  • publicoverridevoidOnException(ExceptionContext filterContext)

  • {

  • base.OnException(filterContext);

  • }

  • }

  • 注意:確保在 HandleErrorAttribute 類中的頂部引用了 System.Web.MVC。

    第四步:定義 OnException 方法

    在 OnException 方法中包含異常日志記錄代碼,如下所示。

  • publicoverridevoidOnException(ExceptionContext filterContext)

  • {

  • FileLogger logger =newFileLogger();

  • logger.LogException(filterContext.Exception);

  • base.OnException(filterContext);

  • }

  • 第五步:改變默認(rèn)的異常過濾器

    打開 FilterConfig.cs 文件,移除 HandleErrorAttribute,然后附上我們上一步驟中所創(chuàng)建的。

  • publicstaticvoidRegisterGlobalFilters(GlobalFilterCollection filters)

  • {

  • //filters.Add(new HandleErrorAttribute());//ExceptionFilter

  • filters.Add(newEmployeeExceptionFilter());

  • filters.Add(newAuthorizeAttribute());

  • }

  • 第六步:執(zhí)行并測試

    首先在 C 盤下創(chuàng)建一個文件夾,命名為「Error」。這個文件夾會存放錯誤的日志文件。

    注意:可以更改路徑為你所期望的路徑。

    按下 F5,然后執(zhí)行應(yīng)用。導(dǎo)航到 Bulk Upload 選項。選擇文件,然后點擊 Upload。

    這次的輸出將會有所不同,我們將會得到一些錯誤視圖,就像之前一樣。唯一的不同便是我們會在「C:\Errors」文件夾發(fā)現(xiàn)一些錯誤日志文件。

    Lab 30 的 Q&A

    異常發(fā)生時,錯誤視圖是如何作為響應(yīng)返回的?

    在上述實驗中,我們重寫了 OnException 方法,然后實現(xiàn)了異常日志的功能。現(xiàn)在的問題是,默認(rèn)的錯誤處理過濾器是如何繼續(xù)工作的?答案是簡單地,查看 OnException 方法的最后一行代碼。

  • base.OnException(filterContext);

  • 這意味著,基類 OnException 將會做剩余的工作,基類 OnException 將會返回錯誤視圖的 ViewResult。

    在 OnException 中,我們可以返回其它結(jié)果嗎?

    答案是肯定的,查看如下代碼。

  • publicoverridevoidOnException(ExceptionContext filterContext)

  • {

  • FileLogger logger =newFileLogger();

  • logger.LogException(filterContext.Exception);

  • //base.OnException(filterContext);

  • filterContext.ExceptionHandled=true;

  • filterContext.Result=newContentResult()

  • {

  • Content="Sorry for the Error"

  • };

  • }

  • 當(dāng)我們想要返回自定義響應(yīng)時,首先要做的事便是,通知 MVC 引擎,告知其我們已經(jīng)手動處理異常了,所以不需要做默認(rèn)的行為,即不需要呈現(xiàn)默認(rèn)的錯誤屏幕。這一切可以通過如下代碼來實現(xiàn)。

  • filterContext.ExceptionHandled=true

  • 7. 路由

    迄今為止我們討論過許多概念,我們也回答了許多有關(guān) MVC 的問題,但是除了一個基本和重要的概念。

    「當(dāng)用戶發(fā)出請求時,確切發(fā)生了什么」?

    一個很好的答案便是「行為方法的執(zhí)行」。但是確切的答案是控制器和犯法是如何被一個特定的 URL 請求識別的?

    當(dāng)我們開始「實現(xiàn)用戶友好的 URLs」的實驗時,我們首先需要回答上述的問題。你也許會奇怪為什么這個主題會放置到最后。我故意將其放置到最后,是因為我想讓更多的人在理解內(nèi)部之前,先了解 MVC。

    理解 RouteTable

    在 ASP.NET MVC 中,存在一個概念,稱作 RouteTable。這里存儲了應(yīng)用的 URL 路由。用簡單的話說,它承載了一個應(yīng)用的 URL 模式的集合。

    默認(rèn)情況下,一個路由將會作為項目模板的一部分被添加??梢酝ㄟ^ Global.asax 文件查看它。在 Application_Start 中,你將會發(fā)現(xiàn)如下的代碼。

  • RouteConfig.RegisterRoutes(RouteTable.Routes);

  • 你將會在 App_Start 文件夾下發(fā)現(xiàn) RouteConfig.cs 文件,它包含了如下代碼。

  • namespaceWebApplication1

  • {

  • publicclassRouteConfig

  • {

  • publicstaticvoidRegisterRoutes(RouteCollection routes)

  • {

  • routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


  • routes.MapRoute(

  • name:"Default",

  • url:"{controller}/{action}/{id}",

  • defaults:new{ controller ="Home", action ="Index", id =UrlParameter.Optional}

  • );

  • }

  • }

  • }

  • 正如你所看見的,RegisterRoutes 方法已經(jīng)通過 Route.MapRoutes 方法定義了一個默認(rèn)的路由。

    在 RegisterRoutes 方法中定義的路由將會在 ASP.NET MVC 請求周期中被用到,用于決定執(zhí)行確切的控制器和方法。

    如果需要,我們可以通過使用 Route.MapRoutes 函數(shù),創(chuàng)建多個路由。內(nèi)部定義路由意味著創(chuàng)建 Route 對象。

    MapRoute 函數(shù)也可以把路由對象附上 RouteHandler,這樣將會是 MVCRouteHandler。

    理解 ASP.NET MVC 請求周期

    在我們開始之前,你需要清楚,我們將要 100% 地解釋請求周期。我們將要接觸到之前未講到的重要概念。

    第一步:UrlRoutingModule

    當(dāng)終端用戶發(fā)出請求后,首先會通過 UrlRoutingModule 對象。UrlRoutingModule 是一個 HTTP 模塊。

    第二步:路由

    UrlRoutingModule 首先會從路由集合中匹配 Route 對象。對于匹配,請求的 URL 將會與路由中定義的 URL 模式相對比。

    下述的規(guī)則將會在匹配中被考慮到。

    • 請求 URL 中參數(shù)的數(shù)字以及在路由中定義的 URL 模式。例如:

    • URL 模式中定義的可選參數(shù)。例如:

    • 在參數(shù)中定義的靜態(tài)參數(shù)。

    第三步:創(chuàng)建 MVC Route Handler

    一旦路由對象被選中,UrlRoutingModule 將會從路由對象中獲得 MvcRouteHandler。

    第四步:創(chuàng)建 RouteData 和 RequestContext

    UrlRoutingModule 對象將會通過 Route 對象創(chuàng)建 RouteData,它將會用于創(chuàng)建 RequestContext。

    RouteData 封裝了關(guān)于路由的信息,如控制器的名稱,行為方法的名稱,路由參數(shù)的值。

    Controller 名稱

    為了從請求 URL 中獲得控制器的名稱,需要遵循如下的簡單規(guī)則。即“在 URL 模式中{Controller} 是識別控制器名稱的關(guān)鍵詞”。

    例如:

    • 當(dāng)URL 模式是 {Controller}/{Action}/{Id},而請求 URL 是「http://localhost:8870/BulkUpload/Upload/5」時,BulkUpload 是控制器的名稱。

    • 當(dāng) URL 模式是 {Action}/{Controller}/{Id},而請求 URL 是 「http://localhost:8870/BulkUpload/Upload/5」時,Upload 是控制器的名稱。

    行為方法名稱

    為了獲得請求 URL 中的行為方法,需要遵循如下的簡單規(guī)則。即「在 URL 模式中 {Action} 是行為方法名稱的關(guān)鍵詞」。

    例如:

    • 當(dāng)URL 模式是 {Controller}/{Action}/{Id},而請求 URL 是「http://localhost:8870/BulkUpload/Upload/5」時,Upload 是行為方法的名稱。

    • 當(dāng) URL 模式是 {Action}/{Controller}/{Id},而請求 URL 是 「http://localhost:8870/BulkUpload/Upload/5」時,BulkUpload 是行為方法的名稱。

    路由參數(shù)

    一個基本的 URL 模式包含如下四個要素。

  • {Controller},用于識別控制器名稱。

  • {Action},識別行為方法名稱。

  • 一些字符串,例如「MyCompany/{Controller}/{Action}」,在這個模式中,「MyCompany」是一個必須的字符串。

  • {Something},例如「{Controller}/{Action}/{Id}」,在這個模式中「Id」是路由參數(shù)。在請求的 URL 中,路由參數(shù)可以被用于獲取 URL 的值。

  • 我們來看一下如下示例。

    路由模式是 {Controller}/{Action}/{Id}。

    請求 URL 是「http://localhost:8870/BulkUpload/Upload/5」。

    測試一:

  • publicclassBulkUploadController:Controller

  • {

  • publicActionResultUpload(string id)

  • {

  • //value of id will be 5 -> string 5

  • ...

  • }

  • }

  • 測試二:

  • publicclassBulkUploadController:Controller

  • {

  • publicActionResultUpload(int id)

  • {

  • //value of id will be 5 -> int 5

  • ...

  • }

  • }

  • 測試三:

  • publicclassBulkUploadController:Controller

  • {

  • publicActionResultUpload(stringMyId)

  • {

  • //value of MyId will be null

  • ...

  • }

  • }

  • 第五步:創(chuàng)建 MVCHandler

    MvcRouteHandler 將會創(chuàng)建 MVCHandler 的實例,傳輸 RequestContext 對象。

    第六步:創(chuàng)建控制器實例

    MVCHandler 將會通過 ControllerFactory(默認(rèn)的是 DefaultControllerFactory) 創(chuàng)建控制器實例。

    第七步:執(zhí)行方法

    MVCHandler 將會觸發(fā)控制器的執(zhí)行方法。執(zhí)行方法在控制器基類中被定義。

    第八步:觸發(fā)行為方法

    每一個控制器都與一個 ControllerActionInvoker 對象相關(guān)聯(lián)。在執(zhí)行方法中,ControllerActionInvoker 觸發(fā)正確的行為方法。

    第九步:執(zhí)行結(jié)果

    行為方法接收到用戶的輸入,然后準(zhǔn)備合適的響應(yīng)數(shù)據(jù),并通過返回一個類型來執(zhí)行結(jié)果?,F(xiàn)在返回的結(jié)果可能是 ViewResult,可能是 RedirectToRoute 結(jié)果或者可能是其它。

    現(xiàn)在,我相信你已經(jīng)對路由的概念有了很好的理解,所以讓我們通過路由來使得項目的 URLs 更友好吧。

    8. Lab 31 — 實現(xiàn)用戶友好性的 URLs

    第一步:重新定義 RegisterRoutes 方法

    在 RegisterRoutes 方法中包含額外的路由。

  • publicstaticvoidRegisterRoutes(RouteCollection routes)

  • {

  • routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


  • routes.MapRoute(

  • name:"Upload",

  • url:"Employee/BulkUpload",

  • defaults:new{ controller ="BulkUpload", action ="Index"}

  • );


  • routes.MapRoute(

  • name:"Default",

  • url:"{controller}/{action}/{id}",

  • defaults:new{ controller ="Home", action ="Index", id =UrlParameter.Optional}

  • );

  • }

  • 正如你所看見的,我們現(xiàn)在已經(jīng)不止定義一個路由了。

    第二步:更改 URL 引用

    從「~/Views/Employee」文件夾下打開 AddNewLink.cshtml 文件,然后更改 BulkUpload 鏈接如下。

  • &nbsp;

  • <a href="/Employee/BulkUpload">BulkUpload</a>

  • 第三步:執(zhí)行并測試

    執(zhí)行應(yīng)用,將會看到神奇的地方。

    正如你所看見的,URL 不再是“Controller/Action”的形式。它看起來更加用戶友好,但是輸出是一樣的。

    我建議你定義更多的路由,嘗試更多的 URLs。

    Lab 31 的 Q&A

    之前的 URL 還是否起作用?

    答案是肯定的,之前的 URL 也會起作用。

    現(xiàn)在 BulkUploadController 中的 Index 方法可以通過兩個 URLs 訪問。

  • http://localhost:8870/Employee/BulkUpload

  • http://localhost:8870/BulkUpload/Index

  • 默認(rèn)路由中的「Id」是什么?

    我們之前提到過它。它被稱作路由參數(shù)。它可以通過 URL 來用于獲取值。它是一個可被替換的查詢字符串。

    路由參數(shù)和查詢字符串的區(qū)別是什么?

    • 查詢字符串有大小限制,然而我們可以定義路由參數(shù)的任意數(shù)字。

    • 我們不能向查詢字符串值添加限制,但是我們可以向路由參數(shù)添加限制。

    • 可以設(shè)定路由參數(shù)的默認(rèn)值,然而查詢字符串的默認(rèn)值不可設(shè)定。

    • 查詢字符串使得 URL 凌亂,但是路由參數(shù)保持 URL 整潔。

    如何向路由參數(shù)應(yīng)用限制?

    可以通過正則表達式來完成這件事。例如,查看如下路由。

  • routes.MapRoute(

  • "MyRoute",

  • "Employee/{EmpId}",

  • new{controller=" Employee ", action="GetEmployeeById"},

  • new{EmpId=@"\d+"}

  • );

  • 行為方法將如下所示。

  • publicActionResultGetEmployeeById(intEmpId)

  • {

  • ...

  • }

  • 現(xiàn)在如果用戶通過 URL「http://..../Employee/1」 或者 「http://..../Employee/111」來發(fā)出請求,行為方法將會得到執(zhí)行,但是如果用戶通過 URL「http://..../Employee/Sukesh」 ,他將會得到「Resource Not Found」的錯誤。

    行為方法中的參數(shù)名稱和路由參數(shù)名稱需要保持一致嗎?

    從根本上說,路由模式也許包含多個 RouteParameters。為了單獨地識別每一個路由參數(shù),需要保持行為方法中的參數(shù)名稱和路由參數(shù)名稱一致。

    定義自定義路由的次序重要嗎?

    答案是肯定的,次序是重要的。UrlRoutingModule 將會匹配第一個路由對象。

    在上述的實驗中,我們已經(jīng)定義了兩個路由。一個是自定義路由,一個是默認(rèn)路由。現(xiàn)在我們來討論一種情況,默認(rèn)路由被首先定義,自定義路由被第二個定義。

    在 這種情況下,終端用戶發(fā)起一個請求 URL,即「http://…/Employee/BulkUpload」。在匹配階段,UrlRoutingModules 將會發(fā)現(xiàn)請求的 URL 與默認(rèn)的路由模式匹配,它將會認(rèn)為「Employee」是控制器的名稱,「BulkUpload」是行為方法的名稱。

    因此次序在定義路由時是非常重要的。大多數(shù)通用的路由應(yīng)該被放置到最后。

    是否存在更簡單的方式來定義行為方法的 URL 模式?

    我們可以運用基于路由的屬性來解決這個問題。讓我們來試一下。

    第一步:使基于路由的屬性可用

    在 RegisterRoutes 方法中的 IgnoreRoute 語句后添加如下代碼。

  • routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  • routes.MapMvcAttributeRoutes();

  • routes.MapRoute(

  • ...

  • 第二步:為行為方法定義路由模式

    在 EmployeeController 中的 Index 行為方法中附上 Route 屬性。

  • [Route("Employee/List")]

  • publicActionResultIndex()

  • {

  • 第三步:執(zhí)行并測試

    執(zhí)行應(yīng)用程序,然后完成登錄操作。

    正如你所看見的,我們擁有相同的輸出結(jié)果,但是不同的是擁有了更加用戶友好性的 URL。

    我們可以通過基于路由的屬性來定義路由參數(shù)嗎?

    答案是肯定的,可以查看如下語法。

  • [Route("Employee/List/{id}")]

  • publicActionResult Index(string id){...}

  • 在這種情況下的限制呢?

    這將會變得更加容易。

  • [Route("Employee/List/{id:int}")]

  • 我們可以擁有如下限制。

  • {x:alpha} – 字符串認(rèn)證

  • {x:bool} – 布爾認(rèn)證

  • {x:datetime} – Date Time 認(rèn)證

  • {x:decimal} – Decimal 認(rèn)證

  • {x:double} – 64 位 Float 認(rèn)證

  • {x:float} – 32 位 Float 認(rèn)證

  • {x:guid} – GUID 認(rèn)證

  • {x:length(6)} – 長度認(rèn)證

  • {x:length(1,20)} – 最小和最大長度認(rèn)證

  • {x:long} – 64 位 Int 認(rèn)證

  • {x:max(10)} – 最大 Integer 長度認(rèn)證

  • {x:maxlength(10)} – 最大長度認(rèn)證

  • {x:min(10)} – 最小 Integer 長度認(rèn)證

  • {x:minlength(10)} – 最小長度認(rèn)證

  • {x:range(10,50)} – 整型 Range 認(rèn)證

  • {x:regex(SomeRegularExpression)} – 正則表達式認(rèn)證

  • 在 RegisterRoutes 方法中 IgnoreRoutes 是用于做什么的?

    當(dāng)我們不想運用路由做指定擴展時,我們可以運用 IgnoreRoutes。作為 MVC 模板的一部分,如下的代碼已經(jīng)寫入 RegisterRoutes 方法中。

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    這意味著,當(dāng)終端用戶發(fā)出一個帶有「.axd」擴展的請求時,將不會執(zhí)行任何路由操作。請求將會直接定位到物理資源。我們也可以定義自己的 IgnoreRoute 語句。

    9. 總結(jié)

    在第 6 天的學(xué)習(xí)中,我們完成了簡單的 MVC 項目。希望你能夠享受完成系列學(xué)習(xí)的樂趣。

    稍等一下!第 7 天的學(xué)習(xí)呢?

    在第 7 天中,我們將會運用 MVC, JQuery 和 Ajax 來創(chuàng)建一個 Single Page 應(yīng)用。這將會更加有趣,并富有挑戰(zhàn)。

    保持學(xué)習(xí)的熱情吧!

    原文地址:Learn MVC Project in 7 days

    OneAPM for .NET 能夠深入到所有 .NET 應(yīng)用內(nèi)部完成應(yīng)用性能管理和監(jiān)控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實用戶體驗監(jiān)控、服務(wù)器監(jiān)控和端到端的應(yīng)用性能管理。想技術(shù)文章,請訪問 OneAPM 官方博客。





    轉(zhuǎn)載于:https://blog.51cto.com/oneapm/1687328

    總結(jié)

    以上是生活随笔為你收集整理的7 天玩转 ASP.NET MVC — 第 6 天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日韩有码网站 | 久久无码av一区二区三区电影网 | 免费精品国产va自在自线 | 日本一区二区三区免费观看 | www国产精品com| 午夜电影中文字幕 | 91综合久久一区二区 | 日韩成人中文字幕 | 久久97超碰 | 亚洲视屏一区 | 97色国产 | 国产精品久久久久久久妇 | 欧美日韩一区二区三区在线观看视频 | 在线观看国产麻豆 | 精品国产aⅴ一区二区三区 在线直播av | 国产在线观看二区 | 久久桃花网 | 欧美一区二区在线免费观看 | 国产精品婷婷 | 久久一二区 | 国产成人精品999在线观看 | 免费黄色网址网站 | 午夜av在线免费 | 久久成人午夜视频 | 狠狠色伊人亚洲综合成人 | 99热这里只有精品国产首页 | 中文av字幕在线观看 | 激情开心网站 | 天天躁日日躁狠狠 | 国产视频一区二区在线播放 | 久久综合色影院 | 午夜久久网 | 丁香婷婷基地 | 美女视频黄免费 | 97超碰超碰 | 国内精品视频在线播放 | 色国产精品 | 性色av一区二区 | 久久精品黄 | 激情婷婷丁香 | 久久女教师| 夜夜夜夜爽 | 国产 日韩 中文字幕 | 91资源在线免费观看 | 99c视频在线| www激情久久 | 97人人模人人爽人人喊中文字 | 麻豆 91 在线| 99综合电影在线视频 | 在线日本v二区不卡 | 成人黄色大片在线免费观看 | 成片视频免费观看 | 日韩视频图片 | 亚洲精品97| 成人一级片免费看 | 深夜国产福利 | 久草在线手机视频 | 欧美日韩不卡一区二区 | 中文字幕在线视频免费播放 | 狠狠狠狠狠狠狠 | 999在线精品 | 亚洲精品白浆高清久久久久久 | 91麻豆视频| 久久久久国产精品免费免费搜索 | 免费日韩av电影 | 日韩成人在线一区二区 | 综合色狠狠 | 在线一区观看 | 国内精品久久久久久久久 | 国产成a人亚洲精v品在线观看 | 国产传媒中文字幕 | a在线免费 | 国产精品久久久久久久电影 | 国产精品午夜久久 | 日本久久久影视 | 伊人五月天婷婷 | 婷婷色狠狠 | 中文字幕免费高 | 国产品久精国精产拍 | 玖玖视频精品 | 国产黄色在线网站 | 国产在线视频不卡 | 欧美天堂久久 | 欧美大香线蕉线伊人久久 | 欧美成人性战久久 | 久久一区二区免费视频 | 亚洲一级在线观看 | 91麻豆精品国产91久久久久久 | 成人cosplay福利网站 | 日韩免费在线观看网站 | 亚洲视频在线免费看 | 大片网站久久 | 久久免费中文视频 | 91资源在线播放 | 天天爱天天干天天爽 | 欧美日韩国产一区 | 91精品一区二区在线观看 | 怡红院av久久久久久久 | 国产免费不卡av | 久久1区| 在线观看第一页 | 福利视频| 色欲综合视频天天天 | 丁香六月综合网 | 狠狠狠色丁香综合久久天下网 | 亚州av成人| 欧美日韩精品在线免费观看 | 久久看片| 精品 一区 在线 | 国产乱对白刺激视频在线观看女王 | 18岁免费看片 | 日本中文字幕在线免费观看 | 国产亚洲精品久久久久久移动网络 | 亚洲精品成人 | 亚洲午夜电影网 | 一级片观看 | 国产高清视频免费观看 | 日韩理论在线播放 | 免费看色的网站 | 免费国产在线视频 | 麻豆精品视频在线观看免费 | 国产在线看一区 | 成人在线播放视频 | 国产精品欧美久久久久天天影视 | av片中文| 五月综合色 | 99久久久久 | 国产一级高清 | 99久久国产免费免费 | 婷婷在线精品视频 | 国产精品18久久久久久vr | 超级碰碰碰免费视频 | 色九九视频 | 久草精品视频在线观看 | 成人手机在线视频 | 久久免费久久 | 伊人电影天堂 | 国产精品中文字幕av | 成人三级网站在线观看 | 日韩在线一二三区 | 国产日本亚洲高清 | 中文字幕在线观看免费高清电影 | 成人黄色中文字幕 | 免费中文字幕 | 国产在线视频一区 | 亚洲电影在线看 | 五月天婷婷在线视频 | 久久96| 插综合网 | 国产三级精品三级在线观看 | 人人爽人人澡人人添人人人人 | 中文字幕欲求不满 | 国产精品久久久久久久久久久免费 | 超碰国产97 | 黄色亚洲片 | 在线有码中文 | 香蕉在线观看视频 | www.com.日本一级 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 97在线观看视频 | 又黄又爽又色无遮挡免费 | 992tv在线 | 欧美性久久久久久 | 免费午夜视频在线观看 | 免费看精品久久片 | 亚洲无吗天堂 | 日韩欧美一区二区在线观看 | 精品欧美小视频在线观看 | 国产小视频在线观看免费 | 天天综合中文 | 色综合久久88色综合天天人守婷 | 国产成人精品一区二区三区在线 | 欧美激情亚洲综合 | 天天操天天吃 | 8x成人在线| 成人av电影在线观看 | av在线收看 | 蜜臀av夜夜澡人人爽人人 | 在线免费观看黄网站 | 亚洲九九影院 | 天天搞天天 | 黄色软件在线观看 | 久久欧美精品 | 日日夜夜精品免费观看 | 成人三级视频 | 日韩二区三区 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 狠狠狠色丁香婷婷综合久久88 | 91热视频 | 日本中文字幕电影在线免费观看 | 99午夜| 狠狠色狠狠色综合系列 | 免费视频xnxx com | 人人澡人人澡人人 | 色激情在线 | 激情综合色综合久久综合 | av高清一区二区三区 | 日韩午夜大片 | 精品久久网| 亚洲 综合 专区 | 国产黄色看片 | 麻豆免费视频网站 | 久草视频中文在线 | 黄色软件在线观看免费 | 久久精品爱爱视频 | 日韩有色 | 国产精品麻豆一区二区三区 | 狠狠操导航 | 欧美激情在线网站 | 精品一区免费 | 成人永久在线 | 久久综合亚洲鲁鲁五月久久 | 欧美一区二区在线看 | 色婷av| 日韩欧美在线综合网 | 国产成人精品一区二区三区免费 | 视频在线在亚洲 | www操操操 | 99久久久久久久久久 | 97国产大学生情侣酒店的特点 | 日韩欧美成| 亚洲人成影院在线 | 国产午夜激情视频 | 欧美午夜寂寞影院 | 亚洲日韩中文字幕 | 日韩网站在线看片你懂的 | 国产成人三级三级三级97 | 99视频网站| 欧美激情第28页 | 亚洲精品久久久蜜桃直播 | 久久久久99精品国产片 | 亚洲欧美观看 | 精品国产成人在线影院 | 亚洲国产成人高清精品 | 在线观看中文字幕第一页 | 日日操日日 | av高清网站在线观看 | 丁香视频五月 | 亚洲电影在线看 | 日本三级人妇 | 久久婷婷国产色一区二区三区 | 特级大胆西西4444www | 国产精品久久 | 最新一区二区三区 | 国产成人精品一区二三区 | caobi视频| 91精品国产亚洲 | 久久99精品久久久久婷婷 | 91亚洲精品久久久蜜桃网站 | 色视频 在线 | 国产精品伦一区二区三区视频 | av片免费播放 | 午夜久久 | 国产在线不卡视频 | 国产精品一区二区三区在线看 | 麻豆91精品91久久久 | 午夜精品婷婷 | 欧美一级裸体视频 | 国产乱对白刺激视频不卡 | 免费看短 | 一区二区三区四区久久 | 激情综合五月网 | 韩国三级在线一区 | 国内精品免费久久影院 | av中文在线影视 | 亚洲精品乱码白浆高清久久久久久 | 二区在线播放 | 日日爽天天操 | 99成人免费视频 | 国产高清综合 | 国产视频综合在线 | 日韩av在线资源 | 91亚洲精品视频 | 精品一二| 国产黄a三级三级三级三级三级 | 91亚色视频在线观看 | 日韩色在线观看 | 黄色高清视频在线观看 | 成人在线免费观看网站 | 国产中文字幕在线观看 | av大片免费看| 狠狠色伊人亚洲综合成人 | av资源免费看 | 国产成人一区二区三区在线观看 | 久久五月婷婷丁香社区 | 久草网站在线观看 | 天天翘av| 日本精品一区二区在线观看 | 欧美一区二区三区免费观看 | 91日韩在线视频 | 免费看av片网站 | 国产99久久九九精品 | www黄com| 国产精品高潮呻吟久久av无 | 亚洲成人av电影在线 | 日韩免费在线 | 成人在线观看av | 色姑娘综合天天 | 久久午夜精品影院一区 | 人人干人人爽 | 日韩午夜av电影 | 国产第一页福利影院 | 成人午夜精品福利免费 | 国产精品一区二区62 | 国产精品99精品久久免费 | 国产伦精品一区二区三区… | 五月天婷亚洲天综合网精品偷 | av在线免费观看网站 | 色婷婷福利 | 中文字幕高清 | 久久九九影院 | 国产视频在线免费观看 | 免费看一级黄色大全 | 国产资源免费 | a黄色 | 中文字幕黄色av | 国产原厂视频在线观看 | 国产日韩欧美自拍 | 亚洲视频456 | 国产精品自产拍在线观看网站 | 超碰在线人人97 | 午夜精品麻豆 | 粉嫩aⅴ一区二区三区 | 国产情侣一区 | 亚洲精品自拍视频在线观看 | 亚洲 欧洲av | 99综合电影在线视频 | 91亚洲精品久久久中文字幕 | 久久久亚洲国产精品麻豆综合天堂 | 深爱激情亚洲 | 国产美女无遮挡永久免费 | 日本精品久久久一区二区三区 | 国产成人精品女人久久久 | 国产精品成人av电影 | 超碰公开97 | 免费观看黄色av | 18国产精品白浆在线观看免费 | 丁香婷婷综合五月 | 特级aaa毛片 | 97成人精品 | 欧美亚洲成人xxx | 国产录像在线观看 | 亚洲精品免费视频 | 最新av在线网站 | 成年人在线看片 | 国产在线精品区 | 99久久精品免费看国产免费软件 | 午夜久久精品 | 久久精品国产第一区二区三区 | 91黄色小网站| 欧美污污视频 | 国产精品乱看 | 中文视频在线播放 | 91亚洲精品视频 | 国产专区在线视频 | 国产精品美女久久久久久久 | 欧美日韩中文在线视频 | 久久香蕉电影网 | 久久久久久久精 | www.亚洲视频 | 日韩欧美网站 | 99视频在线观看一区三区 | 成人毛片在线观看 | 国产亚洲视频在线观看 | 麻豆视频免费版 | 日韩免费三级 | 免费在线观看日韩 | 国产精品第二十页 | 国产成年免费视频 | 婷婷资源站 | 绯色av一区 | 日批视频国产 | 日韩小视频网站 | 亚洲精品午夜aaa久久久 | 国产成人61精品免费看片 | 欧美韩国在线 | 亚洲影院色 | 综合网伊人 | 天天干人人 | 国产成人一级 | 国产原创在线观看 | 人人玩人人添人人澡97 | 中文网丁香综合网 | 精品国产免费观看 | 欧美一区免费在线观看 | 国产日产欧美在线观看 | av亚洲产国偷v产偷v自拍小说 | 国产一区在线免费观看视频 | 久国产在线播放 | 免费人成在线观看网站 | av一区二区三区在线观看 | 激情视频国产 | 天堂av在线中文在线 | 亚洲人成人天堂h久久 | 韩国中文三级 | 最新中文字幕在线观看视频 | 亚洲艳情 | 成人免费在线观看入口 | 久久免费成人精品视频 | 九九亚洲视频 | 亚洲国内精品在线 | 国产看片免费 | 免费在线观看av不卡 | 国产欧美精品xxxx另类 | 日韩精品观看 | 国产精品色在线 | 国产精品成人免费一区久久羞羞 | 精品国产黄色片 | 91福利区一区二区三区 | 日韩精品一区二区三区在线播放 | 伊人婷婷久久 | 亚洲欧美经典 | 国产精品久久久久久久毛片 | 久久久久久久久久久免费av | 国产日女人 | 国产黄a三级三级三级三级三级 | 91九色在线视频观看 | 天天在线视频色 | 国产成人精品av | 日韩免费高清在线观看 | 精品久久久久久久久久国产 | 激情婷婷六月 | 日韩中文字幕免费电影 | 韩日精品在线 | 久久精品三级 | 麻豆免费看片 | 黄色三级免费 | 在线视频免费观看 | 中文字幕乱码日本亚洲一区二区 | 国产原创中文在线 | 免费国产在线精品 | 欧美成人h版 | 色五丁香 | 日韩高清久久 | 在线观看av不卡 | 91视频91蝌蚪 | 欧美大jb| 国产美女视频免费观看的网站 | 中文字幕一区二区三区乱码不卡 | 国产精品嫩草影院123 | 国产精品高清免费在线观看 | 色综合网在线 | 91久久一区二区 | 黄色大片中国 | 亚洲日韩欧美视频 | 日日操日日插 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 国产精品久久久久久久7电影 | 啪啪免费视频网站 | 99久久精品一区二区成人 | 成人国产在线 | 国产精品久久久久一区二区三区 | 在线看一级片 | 欧美大香线蕉线伊人久久 | 久久中文字幕在线视频 | 99久久网站 | 狠狠狠狠狠狠狠狠 | 五月婷婷综合久久 | 亚洲激情五月 | 久久久午夜精品理论片中文字幕 | 99一级片| 好看的国产精品视频 | 国产高清一 | 午夜美女wwww | 激情综合啪 | 国产精品6 | 丁香五香天综合情 | 亚州激情视频 | 日韩精品一区二区三区三炮视频 | 欧美日韩性视频 | 国产精品一区二区在线观看免费 | 久久午夜精品 | 激情五月综合 | 又黄又爽的免费高潮视频 | 91福利视频久久久久 | 日韩午夜网站 | 999色视频| 亚洲成av人电影 | 日韩精品大片 | 丁香网婷婷 | 午夜国产在线 | 鲁一鲁影院 | 少妇精品久久久一区二区免费 | 韩国一区二区三区在线观看 | 国产一区影院 | 国产精品一区二区精品视频免费看 | 欧美 日韩 视频 | 婷婷天天色 | 日韩一二区在线观看 | 久久综合九色综合久久久精品综合 | 久久精品中文字幕一区二区三区 | 中文字幕国语官网在线视频 | 免费一级特黄毛大片 | 精品一区 在线 | 国产精品久久视频 | 国产精品免费大片视频 | 精品视频久久久久久 | 国产视频18| 久久成人一区 | 又黄又爽又色无遮挡免费 | 香蕉日日 | 国产精品免费不 | 婷婷日韩 | 中文字幕在线字幕中文 | 中文字幕视频一区二区 | 久久9999久久免费精品国产 | 国产精品永久在线观看 | 97在线观看视频免费 | 久久精品999| 国产精品18久久久久久久 | 丁香六月天婷婷 | 亚洲一级片av | 国产成人精品久久亚洲高清不卡 | 久久1区| 99爱视频在线观看 | 亚洲精品在线观看的 | 欧美另类亚洲 | 97精品超碰一区二区三区 | 日韩精品一区二区三区在线视频 | 亚洲精品久久在线 | 精品欧美小视频在线观看 | 最近日韩免费视频 | 欧美日韩国产精品一区二区亚洲 | 中文字幕在线影院 | 色综合久久久久综合 | 蜜臀av性久久久久av蜜臀妖精 | a在线视频v视频 | 久久久亚洲成人 | 韩国精品福利一区二区三区 | 操久在线| 91亚洲网站| 久久久受www免费人成 | 色 免费观看 | www.xxx.性狂虐 | 最近日本mv字幕免费观看 | 中文字幕观看av | 久久艹影院 | 91精品视频免费观看 | 日韩首页 | 亚洲精品国产电影 | 国产免费高清视频 | 日韩在线观看视频免费 | 亚洲欧美成人综合 | 国产 视频 久久 | 亚洲一区精品二人人爽久久 | 欧美在线视频a | 99热超碰在线 | www色片| 日韩高清国产精品 | 国产字幕在线观看 | 欧美成人基地 | 欧美一区二区三区四区夜夜大片 | 在线亚洲成人 | 欧美成人黄 | 精品欧美乱码久久久久久 | 四虎成人免费观看 | 欧美精品久久久久久久久免 | 国产亚洲精品久久久久久无几年桃 | 亚洲成人午夜av | 久久精品中文 | 五月婷婷黄色 | av色网站| 少妇搡bbb| 国产精品免费在线观看视频 | 日韩欧美一区二区三区视频 | 午夜久久福利影院 | 国产夫妻自拍av | 久久在线播放 | 日韩精品一区二区三区水蜜桃 | 天天天干天天天操 | 亚洲a资源 | 亚洲欧洲一区二区在线观看 | 美女精品 | 91看片在线观看 | 婷婷黄色片 | 久久综合国产伦精品免费 | 成人久久毛片 | 中文字幕中文字幕在线中文字幕三区 | 91精品久久久久久综合五月天 | 欧美精品二 | 国产三级国产精品国产专区50 | 97人人模人人爽人人少妇 | 日韩精品在线免费播放 | 在线观av | 五月天婷婷综合 | 四虎永久免费网站 | 少妇bbw撒尿| 奇米网444| 午夜精品福利在线 | 婷婷六月激情 | 国产护士在线 | 成人动漫一区二区 | 中文字幕在线免费看 | 97超碰色 | 制服丝袜亚洲 | 精品a视频| 亚洲免费婷婷 | 国产 日韩 在线 亚洲 字幕 中文 | 97超碰在线人人 | 午夜精品一区二区三区可下载 | 色www精品视频在线观看 | 亚洲免费在线看 | 亚洲精品动漫久久久久 | 国产99久久久国产精品免费二区 | 国语麻豆 | 久久久香蕉视频 | 一区av在线播放 | 中文字幕高清视频 | 国产精彩视频一区 | 欧美午夜理伦三级在线观看 | 午夜av一区二区三区 | 白丝av免费观看 | 亚洲精品国产精品国自产在线 | 人人澡人人模 | 免费网站污| av大全免费在线观看 | 99视| 国产你懂的在线 | 欧美日韩精品在线观看视频 | 在线韩国电影免费观影完整版 | 国产精品9999久久久久仙踪林 | 日韩中文字幕免费视频 | 久久综合9988久久爱 | 成人精品福利 | 精品久久久久久久久中文字幕 | 成片免费观看视频大全 | 国产精品久久久久久久久久99 | 在线观看国产福利片 | 欧美国产高清 | 91视频久久久久久 | www.色五月.com | 国产资源网站 | 99久久99久国产黄毛片 | 国产精品麻豆三级一区视频 | 美女久久网站 | 麻豆国产网站入口 | 国产一卡二卡四卡国 | 日韩视频在线不卡 | 欧美视频www | 久草视频在线观 | 亚洲va欧美va人人爽 | 中文字幕一区av | 国际精品久久久 | 欧美日在线 | 99这里只有久久精品视频 | 黄色h在线观看 | 97成人在线免费视频 | 婷婷看片| 久草视频手机在线 | 丁香五月亚洲综合在线 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 久久午夜色播影院免费高清 | 亚洲免费视频在线观看 | 婷婷亚洲综合 | 91天堂素人约啪 | 97色视频在线 | 日韩国产精品久久久久久亚洲 | 五月婷婷操 | 久久久精品 一区二区三区 国产99视频在线观看 | 久久影视精品 | 伊人国产视频 | 国产精品字幕 | 天天草天天爽 | 久久调教视频 | 日本系列中文字幕 | 国产手机av在线 | 99热官网| 91久久爱热色涩涩 | av日韩在线网站 | 在线播放视频一区 | 亚洲成人一二三 | 首页av在线 | 男女全黄一级一级高潮免费看 | 国产中文字幕精品 | 亚洲成aⅴ人在线观看 | 亚洲电影久久 | 欧美影片 | 三级视频片| 人人狠狠综合久久亚洲婷 | 日韩在线观看你懂得 | 国产在线精品一区二区三区 | 91久久爱热色涩涩 | 亚洲在线看 | 久久精精品视频 | 国产一区在线视频 | 国产高清成人在线 | 亚洲免费色 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美日本中文字幕 | 日日操天天操夜夜操 | 国产精品国产三级国产aⅴ无密码 | 国产精品欧美一区二区三区不卡 | 五月亚洲综合 | 奇米影视8888在线观看大全免费 | 四虎www| 日韩精品在线免费播放 | 国产成人a亚洲精品v | 成年人免费av网站 | 欧美极品少妇xbxb性爽爽视频 | 99久久精品免费看国产免费软件 | 国产999免费视频 | 久久久久免费观看 | 国产日产精品一区二区三区四区的观看方式 | 久草在线免费资源站 | 国产精品免费观看久久 | 一区二区久久 | 国内精品免费久久影院 | 精品国产不卡 | 亚洲黑丝少妇 | 午夜精品影院 | 一本一本久久a久久精品综合妖精 | 国产一二三在线视频 | 亚洲一级性 | 欧洲av不卡| 久久精品在线视频 | 久久久久欧美精品 | 色播亚洲婷婷 | 精精国产xxxx视频在线播放 | 久久精品视频国产 | 高清不卡一区二区在线 | 精品特级毛片 | 国产精品一区电影 | 天天干天天射天天操 | 亚洲人人爱 | 国产在线a | 国产免费黄视频在线观看 | 亚洲一本视频 | 日本精品中文字幕在线观看 | 一级片视频免费观看 | 亚州视频在线 | 国产黄色片免费 | 日本中文一区二区 | 欧美精品久久人人躁人人爽 | 韩国三级av在线 | 91黄色在线观看 | 成片免费观看视频999 | 国产91亚洲 | 精品久久一二三区 | 日韩视频在线观看视频 | 五月开心色 | 国产精品免费一区二区三区 | 香蕉影视app | 国产97视频在线 | 永久免费的啪啪网站免费观看浪潮 | 成人黄色小说视频 | a'aaa级片在线观看 | 精品视频在线免费 | 人人超在线公开视频 | 青青河边草免费观看完整版高清 | 成人91av | 亚洲aⅴ乱码精品成人区 | 久久久久久久久久久久99 | 中文电影网| 久久成人精品电影 | 在线视频观看91 | 在线观看免费高清视频大全追剧 | 91精品国产三级a在线观看 | 久久网站最新地址 | 国产精品视频内 | 粉嫩高清一区二区三区 | 中文av在线天堂 | 91福利试看 | 97在线观看免费高清完整版在线观看 | 成人禁用看黄a在线 | 国产91电影在线观看 | 人人搞人人爽 | 色91av| 国产精品岛国久久久久久久久红粉 | 日韩在线观看三区 | 成人免费在线电影 | 91秒拍国产福利一区 | 亚洲最新视频在线播放 | 超碰在线公开免费 | 最近中文字幕免费 | 午夜精品久久久99热福利 | 韩日电影在线 | 亚洲在线a | 色噜噜噜噜 | 欧美久久久久久久久中文字幕 | 日日干天天插 | 免费网站黄| 亚洲国产99 | 手机av在线网站 | 香蕉97视频观看在线观看 | 韩国av不卡 | 日韩精品久久久免费观看夜色 | 日韩精品免费在线视频 | 日韩中文字幕在线观看 | 在线观看免费一级片 | 国产一级片在线播放 | 欧美日韩不卡一区二区 | 最新精品国产 | 911久久香蕉国产线看观看 | 黄污网| 天堂av色婷婷一区二区三区 | 美女视频黄在线 | 久久久久色 | av手机版| 在线国产福利 | 天天色天天干天天 | 亚洲伊人网在线观看 | 亚洲无人区小视频 | 在线中文字幕观看 | 天天爱综合 | 99精品视频在线播放观看 | 在线中文视频 | 超碰在线人人草 | 天天射一射| 丁香激情综合国产 | 开心婷婷色 | 婷婷成人亚洲综合国产xv88 | 成人欧美在线 | 国产在线精品国自产拍影院 | 热久久国产精品 | 手机av在线不卡 | 国产精品99久久久久久有的能看 | 国产精品乱码久久久久久1区2区 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 久久婷婷色综合 | 在线观看黄av | 在线免费视频a | a黄色片| 综合在线亚洲 | 精品久久久久国产 | 91porny九色在线播放 | 欧美日韩在线免费观看视频 | 欧美va天堂va视频va在线 | 日本精品久久久久久 | 国产精品麻豆视频 | 免费看的黄色的网站 | 中文字幕xxxx | 日韩欧美在线观看一区二区 | 97福利视频 | 久久精品视频在线免费观看 | 免费精品久久久 | 美女中文字幕 | 91久久丝袜国产露脸动漫 | 青草视频免费观看 | 亚洲专区免费观看 | 国产美女精品视频免费观看 | 2021国产精品| 成人在线小视频 | 日韩精品免费在线播放 | 久久综合综合久久综合 | 中文字幕影片免费在线观看 | 色婷婷在线播放 | 国内精品久久久久久久影视简单 | 九九九九热精品免费视频点播观看 | 草在线视频 | 黄色片视频在线观看 | 99热精品在线 | 日本久久久久久科技有限公司 | 91精品一区国产高清在线gif | 亚洲最新精品 | 国产精品美乳一区二区免费 | 亚洲午夜小视频 | 天天干天天弄 | 99理论片 | 丝袜美腿av | 欧洲精品一区二区 | av三区在线 | 超碰在线94 | 97超碰免费| 久久久久久久免费看 | 精品99免费视频 | 久久久麻豆精品一区二区 | 国产一区二区在线播放视频 | 99久久日韩精品视频免费在线观看 | 欧美另类xxx | 亚洲午夜精品久久久久久久久久久久 | 五月婷影院 | 亚洲涩涩涩涩涩涩 | 天天爽天天爽天天爽 | 日韩免费在线观看视频 | 午夜电影久久 | 日日夜夜人人天天 | 欧美成人精品三级在线观看播放 | 亚洲成人999| 日本爱爱免费 | 9992tv成人免费看片 | 99久久99久久精品国产片果冰 | 少妇bbbb搡bbbb搡bbbb | 久久综合久久综合久久综合 | 中文字幕在线观看你懂的 | 国产精品av久久久久久无 | 亚洲国产成人精品电影在线观看 | 国产福利午夜 | 婷婷久久综合九色综合 | av电影免费在线播放 | 日本精品视频免费 | 草莓视频在线观看免费观看 | 国产毛片aaa | 国产黄色精品在线 | 人人舔人人爽 | 欧美久久电影 | 日韩精品最新在线观看 | 欧美精品久久久久久久免费 | 久久精品一区二 | 91最新在线视频 | 97色在线观看 | 中文字幕不卡在线88 | 日本性生活免费看 | 色综合久久88色综合天天免费 | 精精国产xxxx视频在线播放 | 91视频这里只有精品 | 91探花在线 | 欧美国产亚洲精品久久久8v | 天天干,天天干 | 久久久久久久亚洲精品 | 最近中文字幕免费 | 五月婷婷丁香在线观看 | 伊人小视频 | 日韩精品短视频 | 在线视频观看成人 | 九九九视频精品 | 91热视频 | 69精品| 99精品观看 | 日韩精品一区在线播放 | 日韩av视屏 | 99国产一区二区三精品乱码 | 国产成人不卡 | 午夜精品视频在线 | 久久www免费人成看片高清 | 国产精品入口66mio女同 | 激情深爱.com| 97人人爽人人 | 黄色官网在线观看 | 91亚洲精品久久久 | 日韩成人看片 | 日本韩国在线不卡 | 不卡视频一区二区三区 | 欧美一区二区三区在线视频观看 | 亚州国产视频 | 狠狠干夜夜爽 | 久久电影色 | 久久久精品影视 | 免费高清无人区完整版 | 日本久久久久久 | 亚洲无人区小视频 | 欧美久草在线 | 欧美亚洲免费在线一区 | 亚洲男人天堂a | 午夜精品电影 | 涩涩爱夜夜爱 | 911香蕉视频 | 欧美成人h版电影 | 国产日女人 | 99热日本| 中文字幕在线观看你懂的 | 国产欧美日韩一区 | 五月天堂网 | 国产精品白丝jk白祙 | 亚洲精品乱码久久久久v最新版 | 一区二区中文字幕在线观看 | 99精品视频在线播放免费 | 黄色三级免费观看 | 久久久综合九色合综国产精品 | 在线a人片免费观看视频 | 99久久久国产精品免费观看 | 久久久久黄色 | 黄色三级免费 | 日本精品中文字幕在线观看 | 国产亚洲午夜高清国产拍精品 | 欧美久久成人 | 亚洲欧美精品一区 | 国产精品视频全国免费观看 | 久久免费高清视频 | 亚洲精品视频在线观看网站 | 91久久国产自产拍夜夜嗨 | 免费高清在线观看成人 | 91精品导航 | 高清色免费 | 国产精品日韩久久久久 | 91精品国产综合久久福利 | 在线观看日韩中文字幕 | 久久久久久久久久网 | 丁香婷婷综合激情五月色 | 久久精品中文字幕一区二区三区 | 一级黄色片毛片 | 久久国产精品一区二区三区 | 日本中文一区二区 | 精品免费 | 久久久久久网站 | 丁香影院在线 | 亚洲精品美女在线观看播放 | 999久久久久久久久6666 | 密桃av在线 | 国产视频 亚洲视频 | 色狠狠综合天天综合综合 | 国产一二三区av | 国产手机免费视频 | 国产裸体视频bbbbb | 91精品伦理 | 91亚洲国产成人久久精品网站 | 在线中文字幕一区二区 | 在线观看一区视频 | 黄色中文字幕 |