3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载)

發布時間:2024/7/19 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我 從事專業開發迄今為止已有 15 年,在此之前,我利用業余時間從事開發至少也有 10 年了。與我這一代的大多數人一樣,我是從 8 位計算機起步,然后轉用 PC 平臺的。隨著計算機的復雜性日益增加,我編寫的應用程序涵蓋了從小型游戲到個人數據管理再到控制外部硬件的各項功能。 不過,在我職業生涯的前半段,我編寫的所有軟件都有一個共同點:即,都是運行在用戶桌面 上的本地應用程序。我最早是在 90 年代初期聽說萬維網這件新生事物。那時我發現,通過構建 Web 應用程序,可以讓我輸入我的考勤卡信息而不必再費時費力從工作場所趕回辦公室。 一言以蔽之,我感覺很是困惑。我當時滿腦子是面向桌面的理念,很難接納這種無狀態的 Web。要添加很多讓人頭疼的調試、我沒有 UNIX 服務器的超級用戶訪問權限,再加上這個奇怪的角括號,這些因素使年輕時的我止步不前,又重返桌面開發渡過了幾年時光。 我遠離了 Web 開發領域,雖然這領域顯然很重要,但我并沒有真正理解其編程模型。然后,Microsoft? .NET Framework 和 ASP.NET 發行了。盡管它與桌面應用程序編程有許多相似之處,但終于有了可以讓我從事 Web 應用程序編程的框架。我可以構建窗口(頁面),將控件與事件掛鉤,而設計器使我不必處理那些討厭的角括號。最妙的是,ASP.NET 會通過查看狀態自動為我處理 Web 的無狀態性質!我又重新找回了程序員的快樂 ... 至少在一段時間內是如此。 隨著經驗的增加,我的設計內容也隨之豐富。我早已掌握了幾種最佳實踐,并將其應用到桌面 應用程序編程。其中的兩種就是:
  • 分離關注點:不要將 UI 邏輯與基礎行為混合在一起。
  • 自動單元測試:編寫自動測試以驗證您的代碼是否按預期執行。
這些是適用于任何技術的基本原則。分離關注點是一項可幫助您處理復雜問題的基本原則。在 同一個對象內混合多種責任(如計算剩余的工時、設置數據格式并繪圖)會給維護帶來很大的負擔。而自動測試對于獲得生產質量的代碼同時仍保持條理性至關重 要,尤其是當您更新現有項目時更是如此。 ASP.NET Web 窗體使入門變得非常簡單,但另一方面,要將我的設計理念應用到 Web 應用程序卻并非易事。Web 窗體堅持以 UI 為側重點;其基本單位為頁面。首先設計 UI 并拖曳控件。只需將應用程序邏輯融入頁面的事件處理程序(與為 Windows? 應用程序啟用的 Visual Basic? 非常相似)就萬事大吉,這一點非常吸引人。 但進一步的頁面單元測試常常有很大困難。您必須先啟動所有 ASP.NET,然后才能在“頁面”對象的生命周期內運行該對象。盡管可以通過發送 HTTP請求到服務器或自動化瀏覽器來測試 Web 應用程序,但這類測試非常脆弱(更換一個控制 ID 測試就會中斷)、難以設置(您必須以完全相同的方式在每位開發人員的計算機上設置該服務器)并且運行緩慢。 當我開始構建更復雜的 Web 應用程序時,Web 窗體提供的抽象概念(如控件、視圖狀態和頁面生命周期)就開始添亂而不是幫忙了。我需要花越來越多的時間來配置數據綁定(并編寫大量的事件處理程序對其進 行正確配置)。我不得不想辦法縮減視圖狀態的大小以便更快加載我的頁面。Web 窗體要求每個 URL 均存在物理文件,這對于動態站點(例如 wiki)非常困難。而成功編寫一個自定義的 WebControl 是一個非常復雜的過程,需要全面了解頁面生命周期和 Visual Studio? 設計器。 自從在 Microsoft 工作開始,我就一直與其他人分享關于各種 .NET 難題的體驗并希望可以解決一些難題。最近,作為開發人員參加有關模式與實踐的 Web 客戶端軟件工廠項目 (codeplex.com/websf) 時,我遇到了一個這樣的機會。特別是,模式與實踐交付的內容之一就是自動單元測試。在 Web 客戶端軟件工廠中,我們建議使用 Model View Presenter (MVP) 模式構建可測試的 Web 窗體。 簡而言之,MVP 并非將您的邏輯放入頁面中,而是讓您構建自己的頁面,頁面 (View) 只需調用單獨的對象,即 Presenter。Presenter 對象隨即執行響應視圖上活動必需的任何邏輯,通常通過使用其它對象 (Model) 訪問數據庫、執行業務邏輯等。一旦這些步驟完成后,Presenter 會更新視圖。這種方法提供了可測試性,因為表示器從 ASP.NET 管道中隔離出來;它與視圖通過界面進行通信并可脫離頁面獨立進行測試。 MVP 的這種功能實現有點笨;您需要單獨的視圖界面,并且您必須在源代碼文件中編寫許多事件轉發函數。但如果您想要在 Web 窗體應用程序中得到可測試的 UI,這差不多是最佳途徑。任何改進均需要在基礎平臺中做出更改。
模型視圖控制器模式 幸運的是,ASP.NET 團隊聽取了象我這樣的開發人員的意見,并且已經著手開發一種新的 Web 應用程序框架,該框架與您所熟知并喜愛的 Web 窗體處于同一層級,但采用一組完全不同的設計目標:
  • 使用 HTTP 和 HTML—不隱藏。
  • 可測試性貫穿整個框架之內。
  • 幾乎在每個點均可擴展。
  • 對輸出進行總體控制。
由于此新框架基于模型視圖控制器 (MVC) 模式,因此其名稱為 ASP.NET MVC。MVC 模式最初在 70 年代發明,是 Smalltalk 技術的一部分。正如我將在本文中所展示的,它實際上非常適合 Web 的性質。MVC 將您的 UI 分為三種不同的對象:用于接收和處理輸入的控制器;包含您域邏輯的模型;以及用于生成輸出的視圖。在 Web 環境中,輸入為 HTTP 請求,而請求流程與圖 1 類似。 Figure 1?MVC 模式請求流程?(單 擊該圖像獲得較大視圖) 這實際上與 Web 窗體中的過程完全不同。在 Web 窗體模型中,輸入進入頁面(視圖),然后視圖負責處理輸入并生成輸出。而 MVC 中這些責任是分開的。 因此,您可能立即會產生以下一種想法:“嘿,這太好了。我應該如何使用它?”或“為什么 我要編寫這些對象,以前只需要編寫一個對象?”這兩個問題都問得很好,最好通過示例來進行解釋。因此,我將使用 MVC Framework 編寫一個小型 Web 應用程序以說明其優點。
創建控制器 要繼續進行,您將需要安裝 Visual Studio 2008 并獲得 MVC Framework 的副本。在撰寫本文時,ASP.NET 擴展的 2007 年 12 月社區技術預覽 (CTP) 中已提供了這些內容 (asp.net/downloads/3.5-extensions)。您可能想要獲取擴展 CTP 和 MVC 工具包,其中包括一些非常有用的幫助程序對象。一旦下載并安裝 CTP 后,您將在“新建項目”對話框中獲得名為“ASP.NET MVC Web 應用程序”的新項目類型。 選擇“MVC Web 應用程序”項目后,會為您提供一個與常用網站或應用程序稍有不同的解決方案。該解決方案模板會創建一個帶有一些新目錄的 Web 應用程序(如圖 2 中所示)。特別是 Controllers 目錄包含各種控制器類,而 Views 目錄(及其所有子目錄)包含了各種視圖。 Figure 2?MVC 項目結構? 我將會編寫一個非常簡單的控制器,返回 URL 中傳遞的名稱。右鍵單擊 Controllers 文件夾并選擇“添加項目”以顯示常用的“添加項目”對話框以及一些新增加的內容,包括 MVC 控制器類和幾個 MVC 視圖組件。在此例中,我將添加一個非常富有想象力、名為 HelloController 的類: 復制代碼 using System;
using System.Web;
using System.Web.Mvc;
namespace HelloFromMVC.Controllers
{
public class HelloController : Controller
{
[ControllerAction]
public void Index()
{
...
}
}
}
控制器類比頁面簡單得多。實際上,唯一真正必需做的就是從 System.Web.Mvc.Controller 中衍生并將 [ControllerAction] 屬性置于您的操作方法中。操作是調用以響應特定 URL 請求的一種方法。操作負責執行所需的一切處理,然后呈現一個視圖。我將通過編寫一個將名稱傳遞到視圖的簡單操作著手,如下所示: 復制代碼 [ControllerAction]
public void HiThere(string id)
{
ViewData["Name"] = id;
RenderView("HiThere");
}
操作方法會通過 ID 參數從 URL 接收該名稱(稍后會介紹方法),將其存儲在 ViewData 集合中,然后呈現名為 HiThere 的視圖。 在討論如何調用此方法,或該視圖的顯示內容之前,我希望說一說可測試性。還記得我之前關 于測試 Web 窗體頁面類有多難的評論嗎?控制器的測試簡單得多。實際上,控制器可以直接實例化,而調用操作方法無需任何附加的基礎結構。您不需要 HTTP 上下文,也不需要服務器,只要測試工具即可。作為示例,我在圖 3 中為此類包括了 Visual Studio Team System (VSTS) 測試單元。 ?Figure?3?Controller Unit Test 復制代碼 namespace HelloFromMVC.Tests
{
[TestClass]
public class HelloControllerFixture
{
[TestMethod]
public void HiThereShouldRenderCorrectView()
{
TestableHelloController controller = new
TestableHelloController();
controller.HiThere("Chris");
Assert.AreEqual("Chris", controller.Name);
Assert.AreEqual("HiThere", controller.ViewName);
}
}
class TestableHelloController : HelloController
{
public string Name;
public string ViewName;
protected override void RenderView(
string viewName, string master, object data)
{
this.ViewName = viewName;
this.Name = (string)ViewData["Name"];
}
}
}
下面將進行幾項操作。實際的測試相當簡單:實例化該控制器,使用預期的數據調用該方法, 然后檢查呈現的視圖是否正確。我通過創建測試專用的子類覆蓋 RenderView 方法進行檢查。這可以縮短實際創建 HTML 的時間。我只關心是否將正確的數據發送到視圖以及是否呈現了正確的視圖。我不關心此測試視圖本身的底層詳細信息。
創建視圖 當然,最終我必須生成一些 HTML,因此,讓我們創建該 HiThere 視圖。要進行此操作,首先,我將在解決方案中的 Views 文件夾下創建名為 Hello 的新文件夾。默認情況下,控制器將在 Views\<控制器前綴> 文件夾(控制器前綴為控制器類的名稱去掉 "Controller" 字樣)中查找視圖。因此,對于 HelloController 呈現的視圖,它會在 Views\Hello 中查找。解決方案的查找結果如圖 4 所示。 Figure 4?將視圖添加到項目中?(單 擊該圖像獲得較大視圖) 視圖的 HTML 如下所示: 復制代碼 <html >
<head runat="server">
<title>Hi There!</title>
</head>
<body>
<div>
<h1>Hello, <%= ViewData["Name"] %></h1>
</div>
</body>
</html>
應注意以下幾件事。沒有 runat="server" 標記。沒有 form 標記。沒有控件聲明。實際上,這看起來更象傳統的 ASP 而不是 ASP.NET。請注意,MVC 視圖僅負責生成輸出,因此其不需要任何 Web 窗體頁面所需的事件處理或復雜控件。 MVC Framework 借用了 .aspx 文件格式作為一種有用的文本模板語言。如果需要,甚至可以使用源代碼,但默認情況下,源代碼文件如下所示: 復制代碼 using System;
using System.Web;
using System.Web.Mvc;
namespace HelloFromMVC.Views.Hello
{
public partial class HiThere : ViewPage
{
}
}
沒有頁面初始化或加載方法,沒有事件處理程序,除了基類聲明以外沒有任何內容,基類聲明 為 ViewPage 而不是 Page。這就是 MVC 視圖所需的一切。運行該應用程序,導航至 http://localhost:<端口>/Hello/HiThere/Chris,您將看到如圖 5 所示的內容。 Figure 5?成功的 MVC 視圖?(單 擊該圖像獲得較大視圖) 如果您看到的并非如圖 5 所示,而是難以理解的意外情況,請不要驚慌。如果您將 HiThere.aspx 文件設置為 Visual Studio 中的活動文檔,則當按 F5 后,Visual Studio 將嘗試直接訪問 .aspx 文件。由于 MVC 視圖要求控制器在顯示前運行,因此嘗試直接導航至該頁面將不起作用。只需將該 URL 編輯為與圖 5 中所示的內容相匹配,即可正常工作。 MVC Framework 如何知道調用我的操作方法?該 URL 甚至沒有文件擴展名。答案是 URL 路由。如果您仔細查看 global.asax.cs 文件,則會看到如圖 6 所示的代碼段。全局 RouteTable 會存儲 Route 對象的集合。每個 Route 說明一個 URL 窗體以及對其進行何種操作。默認情況下,會向該表中添加兩個路由。第一個是該方法的內容。它說明每個 URL 在服務器名后均由三部分組成,第一部分應為控制器名,第二部分為操作名稱,而第三部分為 ID 參數。 ?Figure?6?Route Table 復制代碼 public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
// Change Url= to Url="[controller].mvc/[action]/[id]"
// to enable automatic support on IIS6
RouteTable.Routes.Add(new Route
{
Url = "[controller]/[action]/[id]",
Defaults = new { action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
RouteTable.Routes.Add(new Route
{
Url = "Default.aspx",
Defaults = new {
controller = "Home",
action = "Index",
id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
}
}
復制代碼 Url = "[controller]/[action]/[id]"
此默認路由是能讓我的 HiThere 方法得以調用的路由。請記住此 URL:http://localhost/Hello/HiThere/Chris?此路由將 Hello 與控制器、HiThere 與操作以及 Chris 與 ID 一一對應。MVC Framework 隨即創建 HelloController 實例,調用 HiThere 方法,然后將 Chris 作為 ID 參數的值傳遞。 此默認路由為您提供了許多功能,但您也可以添加自己的路由。例如,我想要一個真正友好的 站點,好友們只需輸入他們的姓名即可獲得個性化的問候。如果我在路由表的頂部添加以下路由 復制代碼 RouteTable.Routes.Add(new Route
{
Url = "[id]",
Defaults = new {
controller = "Hello",
action = "HiThere" },
RouteHandler = typeof(MvcRouteHandler)
});
隨后,我只需訪問 ,我的操作仍處于調用狀態,而我將會看到熟悉的友好問候。 系統如何知道調用哪個控制器和操作?答案是 Defaults 參數。它利用新的 C# 3.0 匿名類型語法來創建一個偽詞典。Route 上的 Defaults 對象可包含任意附加的信息,對于 MVC,它還可以包含一些眾所周知的條目:即控制器和操作。如果 URL 中沒有指定控制器或操作,則其將使用 Defaults 中的名稱。這就是為什么即使我在 URL 中忽略它們,但仍可以將我的請求映射到正確的控制器和操作。 還有一件事需要注意:還記得我說過“添加到表格的頂部”嗎?如果您將其置于底部,將會出 現錯誤。路由根據先到先得的原則進行工作。當處理 URL 時,路由系統會自上至下瀏覽表格,并且使用第一個匹配的路由。在本例中,默認路由 "[controller]/[action]/[id]" 匹配,因為它們是操作和 ID 的默認值。這樣,它會繼續查找 ChrisController,但我沒有控制器,因此會出現錯誤。
稍大的示例 現在,我已經說明了 MVC Framework 的基礎知識,將為您展示一個更大的示例,實現比僅顯示字符串更多的功能。wiki 是一種可以在瀏覽器中進行編輯的網站。可以輕松地添加或編輯頁面。我使用 MVC Framework 編寫了一個小型的示例 wiki。“編輯此頁面”屏幕如圖 7 所示。 Figure 7?編輯主頁?(單擊該 圖像獲得較大視圖) 您可以檢查本文的代碼下載以查看如何實現底層 wiki 邏輯。現在我想重點說明 MVC Framework 如何使 Web 上的 wiki 獲取變得簡單。讓我們先設計 URL 結構。我想要以下各項:
  • /[pagename] 顯示該名稱的頁面。
  • /[pagename]?version=n 顯示頁面的請求版本,其中 0 = 當前版本,1 = 以前的版本,以此類推。
  • /Edit/[pagename] 打開該頁的編輯屏幕。
  • /CreateNewVersion/[pagename] 是為提交編輯而傳入的 URL。
讓我們從 wiki 頁面的基本顯示開始。我為它創建了一個名為 WikiPageController 的新類。接下來,我會添加一個名為 ShowPage 的操作。啟動的 WikiPageController 如圖 8 所示。ShowPage 方法相當簡單。WikiSpace 和 WikiPage 類分別表示一組 wiki 頁面和特定的頁面(及其修訂)。此操作只需加載模型并調用 RenderView。但此處的 "new WikiPageViewData" 行是什么意思? ?Figure?8?WikiPageController Implementation of ShowPage 復制代碼 public class WikiPageController : Controller
{
ISpaceRepository repository;
public ISpaceRepository Repository
{
get {
if (repository == null)
{
repository = new FileBasedSpaceRepository(
Request.MapPath("~/WikiPages"));
}
return repository;
}
set { repository = value; }
}
[ControllerAction]
public void ShowPage(string pageName, int? version)
{
WikiSpace space = new WikiSpace(Repository);
WikiPage page = space.GetPage(pageName);
RenderView("showpage",
new WikiPageViewData
{
Name = pageName,
Page = page,
Version = version ?? 0
});
}
}
我前面的示例說明了一種將數據從控制器傳遞到視圖的方法:即 ViewData 詞典。詞典非常方便,但也很危險。它們幾乎包含一切內容,您不能獲取內容的任何 IntelliSense?,并且由于 ViewData 詞典屬于 Dictionary<string, object> 類型,它將消耗內容,您必須計算所有一切。 當您了解在視圖中將需要什么數據后,就可以傳遞強類型化的 ViewData 對象。在我的示例中,我創建了一個簡單的對象 (WikiPageViewData),如圖 9 中所示。此對象將 wiki 頁面信息帶到視圖,同時還攜帶了一些實用工具方法,執行獲取 wiki 標記的 HTML 版本這類任務。 ?Figure?9?WikiPageViewData Object 復制代碼 public class WikiPageViewData {
public string Name { get; set; }
public WikiPage Page { get; set; }
public int Version { get; set; }
public WikiPageViewData() {
Version = 0;
}
public string NewVersionUrl {
get {
return string.Format("/CreateNewVersion/{0}", Name);
}
}
public string Body {
get { return Page.Versions[Version].Body; }
}
public string HtmlBody {
get { return Page.Versions[Version].BodyAsHtml(); }
}
public string Creator {
get { return Page.Versions[Version].Creator; }
}
public string Tags {
get { return string.Join(",", Page.Versions[Version].Tags); }
}
}
現在,我已經定義了視圖數據,那么,我如何使用它呢?在 ShowPage.aspx.cs 中,您將看到以下內容: 復制代碼 namespace MiniWiki.Views.WikiPage {
public partial class ShowPage : ViewPage<WikiPageViewData>
{
}
}
請注意,我將基類類型定義為 ViewPage<WikiPageViewData>。這意味著頁面的 ViewData 屬性為 WikiPageViewData 類型,而不是象以前示例中的“Dictionary”。 .aspx 文件中的實際標記非常簡單: 復制代碼 <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
AutoEventWireup="true" CodeBehind="ShowPage.aspx.cs"
Inherits="MiniWiki.Views.WikiPage.ShowPage" %>
<asp:Content
ID="Content1"
ContentPlaceHolderID="MainContentPlaceHolder"
runat="server">
<h1><%= ViewData.Name %></h1>
<div id="content" class="wikiContent">
<%= ViewData.HtmlBody %>
</div>
</asp:Content>
請注意,當引用 ViewData 時,我沒有使用索引操作符 []。由于我現在有強類型化的 ViewData,我可以直接訪問該屬性。不需要進行任何計算,而 Visual Studio 會提供 IntelliSense。 目光敏銳的讀者將會注意到此文件中的 <asp:Content> 標記。沒錯,“母版頁”確實可以與 MVC 視圖配合使用。并且“母版頁”還可以成為視圖。讓我們看看“母版頁”的源代碼: 復制代碼 namespace MiniWiki.Views.Layouts
{
public partial class Site :
System.Web.Mvc.ViewMasterPage<WikiPageViewData>
{
}
}
相關標記如圖 10 中所示。現在,“母版頁”將獲得與視圖完全相同的 ViewData 對象。我已經將“母版頁”的基類聲明為 ViewMasterPage<WikiPageViewData>,因此,我擁有了正確類型的 ViewData。我會在那里設置各種 DIV 標記以對頁面進行布局,填寫版本列表,然后以常用內容占位符收尾。 ?Figure?10?Site.Master 復制代碼 <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="MiniWiki.Views.Layouts.Site" %> <%@ Import Namespace="MiniWiki.Controllers" %> <%@ Import Namespace="MiniWiki.DomainModel" %> <%@ Import Namespace="System.Web.Mvc" %> <html > <head runat="server"> <title><%= ViewData.Name %></title> <link href="http://http://www.cnblogs.com/Content/Site.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="inner"> <div id="top"> <div id="header"> <h1><%= ViewData.Name %></h1> </div> <div id="menu"> <ul> <li><a href="http://Home">Home</a></li> <li> <%= Html.ActionLink("Edit this page", new { controller = "WikiPage", action = "EditPage", pageName = ViewData.Name })%> </ul> </div> </div> <div id="main"> <div id="revisions"> Revision history: <ul> <% int i = 0; foreach (WikiPageVersion version in ViewData.Page.Versions) { %> <li> <a href="http://<%= ViewData.Name %>?version=<%= i %>"> <%= version.CreatedOn %> by <%= version.Creator %> </a> </li> <% ++i; } %> </ul> </div> <div id="maincontent"> <asp:ContentPlaceHolder ID="MainContentPlaceHolder" runat="server"> </asp:ContentPlaceHolder> </div> </div> </div> </body> </html> 另一件需要注意的事是對 Html.ActionLink 的調用。以下是呈現幫助程序的一個示例。各種視圖類均具有兩種屬性,Html 和 Url。每種均有輸出 HTML 代碼塊的有用方法。在本例中,Html.ActionLink 獲取一個對象(此處為匿名類型)并通過路由系統將其返回。這將會生成一個 URL,該 URL 將路由至我指定的控制器和操作。這樣一來,無論我如何更改路由,“編輯此頁面”鏈接將始終指向正確的位置。 您可能還注意到,我還不得不依靠手動構建鏈接(到先前頁面版本的鏈接)。遺憾的是,當前 的路由系統在涉及查詢字符串時生成 URL 的功能不是十分完善。這應會在框架的后續版本中得到修復。
創建表單和回發 現在,讓我們看看控制器上的 EditPage 操作: 復制代碼 [ControllerAction]
public void EditPage(string pageName)
{
WikiSpace space = new WikiSpace(Repository);
WikiPage page = space.GetPage(pageName);
RenderView("editpage",
new WikiPageViewData {
Name = pageName,
Page = page });
}
同樣,該操作所做的不多—它只是呈現指定頁面的視圖。視圖中的內容變得更加有趣,如圖 11 中所示。此文件構建了一個 HTML 表單,但沒有出現 Runat="server"。Url.Action helper 用于生成表單回發的 URL。其中還使用了幾種不同的 HTML 幫助程序(如 TextBox、TextArea 和 SubmitButton)。它們會出色完成您的預期目標:為各種輸入字段生成 HTML。 ?Figure?11?EditPage.aspx 復制代碼 <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="EditPage.aspx.cs" Inherits="MiniWiki.Views.WikiPage.EditPage" %> <%@ Import Namespace="System.Web.Mvc" %> <%@ Import Namespace="MiniWiki.Controllers" %> <asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server"> <form action="<%= Url.Action( new { controller = "WikiPage", action = "NewVersion", pageName = ViewData.Name })%>" method=post> <% if (ViewContext.TempData.ContainsKey("errors")) { %> <div id="errorlist"> <ul> <% foreach (string error in (string[])ViewContext.TempData["errors"]) { %> <li><%= error%></li> <% } %> </ul> </div> <% } %> Your name: <%= Html.TextBox("Creator", ViewContext.TempData.ContainsKey("creator") ? (string)ViewContext.TempData["creator"] : ViewData.Creator)%> <br /> Please enter your updates here:<br /> <%= Html.TextArea("Body", ViewContext.TempData.ContainsKey("body") ? (string)ViewContext.TempData["body"] : ViewData.Body, 30, 65)%> <br /> Tags: <%= Html.TextBox( "Tags", ViewContext.TempData.ContainsKey("tags") ? (string)ViewContext.TempData["tags"] : ViewData.Tags)%> <br /> <%= Html.SubmitButton("SubmitAction", "OK")%> <%= Html.SubmitButton("SubmitAction", "Cancel")%> </form> </asp:Content> 處理 Web 編程最頭疼的事情之一就是表單中的錯誤。更確切地說,您想要顯示錯誤信息,但同時想要保留原來輸入的數據。我們都有過那種經歷,在填寫一張有 35 個字段的表單時出現一個錯誤,程序卻只是提供一堆錯誤信息和一張新的空白表單。MVC Framework 使用 TempData 存儲以前輸入信息,以便可以重新填入表單。這是 ViewState 實際上在 Web 窗體中變得非常簡單的原因,因為保存控件的內容幾乎是自動的。 我想在 MVC 中如法炮制,因此引入了 TempData。TempData 是一種詞典,與非類型化的 ViewData 很相似。不過,TempData 的內容僅針對單一請求存在,隨后就會被刪除。要了解如何使用此方法,請參閱圖 12,NewVersion 操作。 ?Figure?12?NewVersion Action 復制代碼 [ControllerAction] public void NewVersion(string pageName) { NewVersionPostData postData = new NewVersionPostData(); postData.UpdateFrom(Request.Form); if (postData.SubmitAction == "OK") { if (postData.Errors.Length == 0) { WikiSpace space = new WikiSpace(Repository); WikiPage page = space.GetPage(pageName); WikiPageVersion newVersion = new WikiPageVersion( postData.Body, postData.Creator, postData.TagList); page.Add(newVersion); } else { TempData["creator"] = postData.Creator; TempData["body"] = postData.Body; TempData["tags"] = postData.Tags; TempData["errors"] = postData.Errors; RedirectToAction(new { controller = "WikiPage", action = "EditPage", pageName = pageName }); return; } } RedirectToAction(new { controller = "WikiPage", action = "ShowPage", pageName = pageName }); } 首先,它創建一個 NewVersionPostData 對象。這是另一個幫助程序對象,具有存儲記入的內容和進行某些驗證的屬性和方法。為加載 postData 對象,我將使用 MVC 工具包的幫助程序。UpdateFrom 實際上是工具包提供的擴展方法,它使用反射將表單字段的名稱與我的對象中屬性的名稱相對映。最終結果是,所有字段值均載入到我的 postData 對象中。不過,UpdateFrom 使用起來確實有缺點,由于它直接從 HttpRequest 獲取表單數據,使單元測試變得更為困難。 NewVersion 檢查的第一項是 SubmitAction。如果用戶單擊“確定”按鈕并確實想要發布編輯的頁面,則此項檢查將通過。如果此處有任何其它值,操作會重定向回 ShowPage,只是重新顯示原來的頁面。 如果用戶確實單擊了“確定”,則檢查 postData.Errors 屬性。這將在記入內容上運行一些簡單的驗證。如果沒有任何錯誤,我會將新版本的頁面重新寫入 wiki。不過,如果出現錯誤,情況會變得饒有趣味。 如果出現錯誤,我會設置 TempData 詞典的各個字段,以便其包含 PostData 的內容。然后,我會重定向回“編輯”頁面。現在,由于已設置 TempData,頁面將重新顯示以用戶上次記入的值初始化的表單。 處理記入、驗證和 TempData 的這個過程現在變得有些煩瑣,并且需要多做一些手動工作。將來發行的版本應包括至少會將一些 TempData 檢查自動化的幫助程序方法。關于 TempData 的最后一個注意事項是:TempData 的內容存儲在用戶的服務器端會話中。如果您關閉會話,TempData 將無法正常工作。
創建控制器 現在,wiki 的基礎已在發揮功效,但繼續進行之前,我想要明確實現中的以下幾個要點。例如,Repository 屬性用于分離 wiki 的邏輯與物理存儲。您可以提供在文件系統(正如我所做的那樣)、數據庫或您想要的任何位置中存儲內容的存儲庫。遺憾的是,我需要解決兩個問題。 首先,我的控制器類與具體的 FileBasedSpaceRepository 類緊密地連在一起。我需要一個默認值,以便在屬性沒有設置時,也能合理使用。更糟的是,磁盤上文件的路徑在這里也是硬編碼的。最起碼,它應取自配置。 其次,我的對象必須依賴存儲庫,否則無法運行。對于良好的設計,存儲庫實際應為構造函數 參數,而不是屬性。但我無法將其添加到構造函數中,因為 MVC Framework 要求控制器上的構造函數不能有參數。 幸運的是,我可以通過一個擴展性掛接擺脫此限制:即控制器工廠。控制器工廠的功能正如其 名稱所指:它創建 Controller 實例。您只需要創建一個類實現 IControllerFactory 接口并向 MVC 系統注冊即可。您可以為所有控制器或僅為指定的類型注冊控制器工廠。圖 13 所示為 WikiPageController 的控制器工廠,其現在將存儲庫作為構造函數參數傳遞。在這種情況下,實現非常煩瑣,但它可以創建能使用更強大工具(特別是依賴關系注入容器)的控制器。 無論如何,現在我擁有了將控制器依賴關系分離到對象中(易于管理和維護)的所有詳細信息。 ?Figure?13?Controller Factory 復制代碼 public class WikiPageControllerFactory : IControllerFactory { public IController CreateController(RequestContext context, Type controllerType) { return new WikiPageController( GetConfiguredRepository(context.HttpContext.Request)); } private ISpaceRepository GetConfiguredRepository(IHttpRequest request) { return new FileBasedSpaceRepository(request.MapPath("~/WikiPages")); } } 此工作的最后一步是向框架注冊工廠。通過 ControllerBuilder 類可進行此操作,方法是將以下行添加到 Application_Start 方法中的 Global.asax.cs(路由前后均可): 復制代碼 ControllerBuilder.Current.SetControllerFactory(
typeof(WikiPageController), typeof(WiliPageControllerFactory));
這將注冊 WikiPageController 的工廠。如果此項目中有其他控制器,它們不會使用此工廠,因為此工廠僅針對 WikiPageController 類型進行了注冊。如果您想要將工廠設置為供所有控制器使用,還可以調用 SetDefaultControllerFactory。
其他擴展點 控制器工廠只是框架擴展性的起點。本文中無法詳述所有的細節,因此我將僅僅說明要點。首 先,如果您想要輸出的內容不是 HTML,或想要使用其他模板引擎而不是 Web 窗體,可將控制器的 ViewFactory 設為其他項。您可以實現 IviewFactory 界面,然后即可完全控制如何生成輸出。這對于生成 RSS、XML 或圖形非常有用。 正如您所見到的,路由系統非常靈活。但路由系統中沒有任何內容是 MVC 專用的。每個路由均有一個 RouteHandler 屬性;目前為止,我始終將其設為 MvcRouteHandler。但可以實現 IRouteHandler 界面并將路由系統與其他 Web 技術掛接。將來推出的框架將附帶 WebFormsRouteHandler,并且其他技術也會在將來利用通用路由系統的優勢。 控制器并非必須從 System.Web.Mvc.Controller 衍生。控制器需要做的僅僅是實現 IController 界面,該界面只有稱為 Execute 的一種方法。您可以從中進行任何操作。另一方面,如果您想將 Controller 基類的幾種行為組合在一起,您可以覆蓋 Controller 的許多虛擬函數:
  • OnPreAction、OnPostAction 和 OnError 可讓您將每個已執行操作上的預處理和后處理連接起來。OnError 為您提供在控制器內處理錯誤的機制。
  • 當 URL 路由到控制器但控制器沒有實現路由中請求的操作時,會調用 HandleUnknownAction。默認情況下,此方法會拋出一個異常,但您可以用所需的操作覆蓋默認值。
  • InvokeAction 是一種方法,它負責解決調用何種操作方法并進行調用。如果您想要自定義過程(例如,除去 [ControllerAction] 屬性的要求),應使用該方法。
還有其他幾種針對 Controller 的虛擬方法,但這些方法主要是測試掛接而不是作為擴展點。例如,RedirectToAction 是虛擬的,因此您可以創建實際并不進行重定向的衍生類。這樣,您不需要完全運行 Web 服務器就能測試重定向操作。
要告別 Web 窗體嗎? 現在您可能在想:“Web 窗體會面臨怎樣的命運?MVC 會取代它嗎?”答案是否定的!Web 窗體是一種普及技術,Microsoft 將繼續支持并改進它。它在許多應用程序中發揮著重要的作用;例如,可使用 Web 窗體創建典型的 Intranet 數據庫報表應用程序,所花的時間比使用 MVC 編寫短得多。此外,Web 窗體支持大量的控件,許多控件均具備非常先進的功能,可以大大提高效率。 那么,什么時候應該選擇 MVC 呢?這主要取決于您的要求和喜好。您是否正在為獲得想要的 URL 格式而煩惱?您是否想要對 UI 進行單元測試?以上情況均需要依靠 MVC。反之,如果您要顯示許多數據,提供可編輯的網格和優良的樹形視圖控件?那么,您暫時最好還是使用 Web 窗體。 今后,MVC Framework 很可能在 UI 控制部分有所改進,但在便利性上,它可能始終不及 Web 窗體,因為后者具備大量拖曳功能。同時,ASP.NET MVC Framework 為 Web 開發人員提供了一種在 Microsoft .NET Framework 中構建 Web 應用程序的新方法。Framework 針對可測試性設計、推倡使用 HTTP 并且幾乎在每個點均可擴展。對于那些想要完全控制其 Web 應用程序的開發人員來說,這是一個對 Web 窗體的誘人補充。
Chris Tavares 是 Microsoft 模式和實施方案小組的一名開發人員,他致力于幫助開發社區了解在 Microsoft 平臺上構建系統的最佳實踐。他還是 ASP.NET MVC 小組的虛擬成員,幫助您設計新的框架。可以通過 cct@tavaresstudios.com 與 Chris 取得聯系。 我 從事專業開發迄今為止已有 15 年,在此之前,我利用業余時間從事開發至少也有 10 年了。與我這一代的大多數人一樣,我是從 8 位計算機起步,然后轉用 PC 平臺的。隨著計算機的復雜性日益增加,我編寫的應用程序涵蓋了從小型游戲到個人數據管理再到控制外部硬件的各項功能。 不過,在我職業生涯的前半段,我編寫的所有軟件都有一個共同點:即,都是運行在用戶桌面 上的本地應用程序。我最早是在 90 年代初期聽說萬維網這件新生事物。那時我發現,通過構建 Web 應用程序,可以讓我輸入我的考勤卡信息而不必再費時費力從工作場所趕回辦公室。 一言以蔽之,我感覺很是困惑。我當時滿腦子是面向桌面的理念,很難接納這種無狀態的 Web。要添加很多讓人頭疼的調試、我沒有 UNIX 服務器的超級用戶訪問權限,再加上這個奇怪的角括號,這些因素使年輕時的我止步不前,又重返桌面開發渡過了幾年時光。 我遠離了 Web 開發領域,雖然這領域顯然很重要,但我并沒有真正理解其編程模型。然后,Microsoft? .NET Framework 和 ASP.NET 發行了。盡管它與桌面應用程序編程有許多相似之處,但終于有了可以讓我從事 Web 應用程序編程的框架。我可以構建窗口(頁面),將控件與事件掛鉤,而設計器使我不必處理那些討厭的角括號。最妙的是,ASP.NET 會通過查看狀態自動為我處理 Web 的無狀態性質!我又重新找回了程序員的快樂 ... 至少在一段時間內是如此。 隨著經驗的增加,我的設計內容也隨之豐富。我早已掌握了幾種最佳實踐,并將其應用到桌面 應用程序編程。其中的兩種就是:
  • 分離關注點:不要將 UI 邏輯與基礎行為混合在一起。
  • 自動單元測試:編寫自動測試以驗證您的代碼是否按預期執行。
這些是適用于任何技術的基本原則。分離關注點是一項可幫助您處理復雜問題的基本原則。在 同一個對象內混合多種責任(如計算剩余的工時、設置數據格式并繪圖)會給維護帶來很大的負擔。而自動測試對于獲得生產質量的代碼同時仍保持條理性至關重 要,尤其是當您更新現有項目時更是如此。 ASP.NET Web 窗體使入門變得非常簡單,但另一方面,要將我的設計理念應用到 Web 應用程序卻并非易事。Web 窗體堅持以 UI 為側重點;其基本單位為頁面。首先設計 UI 并拖曳控件。只需將應用程序邏輯融入頁面的事件處理程序(與為 Windows? 應用程序啟用的 Visual Basic? 非常相似)就萬事大吉,這一點非常吸引人。 但進一步的頁面單元測試常常有很大困難。您必須先啟動所有 ASP.NET,然后才能在“頁面”對象的生命周期內運行該對象。盡管可以通過發送 HTTP請求到服務器或自動化瀏覽器來測試 Web 應用程序,但這類測試非常脆弱(更換一個控制 ID 測試就會中斷)、難以設置(您必須以完全相同的方式在每位開發人員的計算機上設置該服務器)并且運行緩慢。 當我開始構建更復雜的 Web 應用程序時,Web 窗體提供的抽象概念(如控件、視圖狀態和頁面生命周期)就開始添亂而不是幫忙了。我需要花越來越多的時間來配置數據綁定(并編寫大量的事件處理程序對其進 行正確配置)。我不得不想辦法縮減視圖狀態的大小以便更快加載我的頁面。Web 窗體要求每個 URL 均存在物理文件,這對于動態站點(例如 wiki)非常困難。而成功編寫一個自定義的 WebControl 是一個非常復雜的過程,需要全面了解頁面生命周期和 Visual Studio? 設計器。 自從在 Microsoft 工作開始,我就一直與其他人分享關于各種 .NET 難題的體驗并希望可以解決一些難題。最近,作為開發人員參加有關模式與實踐的 Web 客戶端軟件工廠項目 (codeplex.com/websf) 時,我遇到了一個這樣的機會。特別是,模式與實踐交付的內容之一就是自動單元測試。在 Web 客戶端軟件工廠中,我們建議使用 Model View Presenter (MVP) 模式構建可測試的 Web 窗體。 簡而言之,MVP 并非將您的邏輯放入頁面中,而是讓您構建自己的頁面,頁面 (View) 只需調用單獨的對象,即 Presenter。Presenter 對象隨即執行響應視圖上活動必需的任何邏輯,通常通過使用其它對象 (Model) 訪問數據庫、執行業務邏輯等。一旦這些步驟完成后,Presenter 會更新視圖。這種方法提供了可測試性,因為表示器從 ASP.NET 管道中隔離出來;它與視圖通過界面進行通信并可脫離頁面獨立進行測試。 MVP 的這種功能實現有點笨;您需要單獨的視圖界面,并且您必須在源代碼文件中編寫許多事件轉發函數。但如果您想要在 Web 窗體應用程序中得到可測試的 UI,這差不多是最佳途徑。任何改進均需要在基礎平臺中做出更改。
模型視圖控制器模式 幸運的是,ASP.NET 團隊聽取了象我這樣的開發人員的意見,并且已經著手開發一種新的 Web 應用程序框架,該框架與您所熟知并喜愛的 Web 窗體處于同一層級,但采用一組完全不同的設計目標:
  • 使用 HTTP 和 HTML—不隱藏。
  • 可測試性貫穿整個框架之內。
  • 幾乎在每個點均可擴展。
  • 對輸出進行總體控制。
由于此新框架基于模型視圖控制器 (MVC) 模式,因此其名稱為 ASP.NET MVC。MVC 模式最初在 70 年代發明,是 Smalltalk 技術的一部分。正如我將在本文中所展示的,它實際上非常適合 Web 的性質。MVC 將您的 UI 分為三種不同的對象:用于接收和處理輸入的控制器;包含您域邏輯的模型;以及用于生成輸出的視圖。在 Web 環境中,輸入為 HTTP 請求,而請求流程與圖 1 類似。 Figure 1?MVC 模式請求流程?(單 擊該圖像獲得較大視圖) 這實際上與 Web 窗體中的過程完全不同。在 Web 窗體模型中,輸入進入頁面(視圖),然后視圖負責處理輸入并生成輸出。而 MVC 中這些責任是分開的。 因此,您可能立即會產生以下一種想法:“嘿,這太好了。我應該如何使用它?”或“為什么 我要編寫這些對象,以前只需要編寫一個對象?”這兩個問題都問得很好,最好通過示例來進行解釋。因此,我將使用 MVC Framework 編寫一個小型 Web 應用程序以說明其優點。
創建控制器 要繼續進行,您將需要安裝 Visual Studio 2008 并獲得 MVC Framework 的副本。在撰寫本文時,ASP.NET 擴展的 2007 年 12 月社區技術預覽 (CTP) 中已提供了這些內容 (asp.net/downloads/3.5-extensions)。您可能想要獲取擴展 CTP 和 MVC 工具包,其中包括一些非常有用的幫助程序對象。一旦下載并安裝 CTP 后,您將在“新建項目”對話框中獲得名為“ASP.NET MVC Web 應用程序”的新項目類型。 選擇“MVC Web 應用程序”項目后,會為您提供一個與常用網站或應用程序稍有不同的解決方案。該解決方案模板會創建一個帶有一些新目錄的 Web 應用程序(如圖 2 中所示)。特別是 Controllers 目錄包含各種控制器類,而 Views 目錄(及其所有子目錄)包含了各種視圖。 Figure 2?MVC 項目結構? 我將會編寫一個非常簡單的控制器,返回 URL 中傳遞的名稱。右鍵單擊 Controllers 文件夾并選擇“添加項目”以顯示常用的“添加項目”對話框以及一些新增加的內容,包括 MVC 控制器類和幾個 MVC 視圖組件。在此例中,我將添加一個非常富有想象力、名為 HelloController 的類: 復制代碼 using System;
using System.Web;
using System.Web.Mvc;
namespace HelloFromMVC.Controllers
{
public class HelloController : Controller
{
[ControllerAction]
public void Index()
{
...
}
}
}
控制器類比頁面簡單得多。實際上,唯一真正必需做的就是從 System.Web.Mvc.Controller 中衍生并將 [ControllerAction] 屬性置于您的操作方法中。操作是調用以響應特定 URL 請求的一種方法。操作負責執行所需的一切處理,然后呈現一個視圖。我將通過編寫一個將名稱傳遞到視圖的簡單操作著手,如下所示: 復制代碼 [ControllerAction]
public void HiThere(string id)
{
ViewData["Name"] = id;
RenderView("HiThere");
}
操作方法會通過 ID 參數從 URL 接收該名稱(稍后會介紹方法),將其存儲在 ViewData 集合中,然后呈現名為 HiThere 的視圖。 在討論如何調用此方法,或該視圖的顯示內容之前,我希望說一說可測試性。還記得我之前關 于測試 Web 窗體頁面類有多難的評論嗎?控制器的測試簡單得多。實際上,控制器可以直接實例化,而調用操作方法無需任何附加的基礎結構。您不需要 HTTP 上下文,也不需要服務器,只要測試工具即可。作為示例,我在圖 3 中為此類包括了 Visual Studio Team System (VSTS) 測試單元。 ?Figure?3?Controller Unit Test 復制代碼 namespace HelloFromMVC.Tests
{
[TestClass]
public class HelloControllerFixture
{
[TestMethod]
public void HiThereShouldRenderCorrectView()
{
TestableHelloController controller = new
TestableHelloController();
controller.HiThere("Chris");
Assert.AreEqual("Chris", controller.Name);
Assert.AreEqual("HiThere", controller.ViewName);
}
}
class TestableHelloController : HelloController
{
public string Name;
public string ViewName;
protected override void RenderView(
string viewName, string master, object data)
{
this.ViewName = viewName;
this.Name = (string)ViewData["Name"];
}
}
}
下面將進行幾項操作。實際的測試相當簡單:實例化該控制器,使用預期的數據調用該方法, 然后檢查呈現的視圖是否正確。我通過創建測試專用的子類覆蓋 RenderView 方法進行檢查。這可以縮短實際創建 HTML 的時間。我只關心是否將正確的數據發送到視圖以及是否呈現了正確的視圖。我不關心此測試視圖本身的底層詳細信息。
創建視圖 當然,最終我必須生成一些 HTML,因此,讓我們創建該 HiThere 視圖。要進行此操作,首先,我將在解決方案中的 Views 文件夾下創建名為 Hello 的新文件夾。默認情況下,控制器將在 Views\<控制器前綴> 文件夾(控制器前綴為控制器類的名稱去掉 "Controller" 字樣)中查找視圖。因此,對于 HelloController 呈現的視圖,它會在 Views\Hello 中查找。解決方案的查找結果如圖 4 所示。 Figure 4?將視圖添加到項目中?(單 擊該圖像獲得較大視圖) 視圖的 HTML 如下所示: 復制代碼 <html >
<head runat="server">
<title>Hi There!</title>
</head>
<body>
<div>
<h1>Hello, <%= ViewData["Name"] %></h1>
</div>
</body>
</html>
應注意以下幾件事。沒有 runat="server" 標記。沒有 form 標記。沒有控件聲明。實際上,這看起來更象傳統的 ASP 而不是 ASP.NET。請注意,MVC 視圖僅負責生成輸出,因此其不需要任何 Web 窗體頁面所需的事件處理或復雜控件。 MVC Framework 借用了 .aspx 文件格式作為一種有用的文本模板語言。如果需要,甚至可以使用源代碼,但默認情況下,源代碼文件如下所示: 復制代碼 using System;
using System.Web;
using System.Web.Mvc;
namespace HelloFromMVC.Views.Hello
{
public partial class HiThere : ViewPage
{
}
}
沒有頁面初始化或加載方法,沒有事件處理程序,除了基類聲明以外沒有任何內容,基類聲明 為 ViewPage 而不是 Page。這就是 MVC 視圖所需的一切。運行該應用程序,導航至 http://localhost:<端口>/Hello/HiThere/Chris,您將看到如圖 5 所示的內容。 Figure 5?成功的 MVC 視圖?(單 擊該圖像獲得較大視圖) 如果您看到的并非如圖 5 所示,而是難以理解的意外情況,請不要驚慌。如果您將 HiThere.aspx 文件設置為 Visual Studio 中的活動文檔,則當按 F5 后,Visual Studio 將嘗試直接訪問 .aspx 文件。由于 MVC 視圖要求控制器在顯示前運行,因此嘗試直接導航至該頁面將不起作用。只需將該 URL 編輯為與圖 5 中所示的內容相匹配,即可正常工作。 MVC Framework 如何知道調用我的操作方法?該 URL 甚至沒有文件擴展名。答案是 URL 路由。如果您仔細查看 global.asax.cs 文件,則會看到如圖 6 所示的代碼段。全局 RouteTable 會存儲 Route 對象的集合。每個 Route 說明一個 URL 窗體以及對其進行何種操作。默認情況下,會向該表中添加兩個路由。第一個是該方法的內容。它說明每個 URL 在服務器名后均由三部分組成,第一部分應為控制器名,第二部分為操作名稱,而第三部分為 ID 參數。 ?Figure?6?Route Table 復制代碼 public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
// Change Url= to Url="[controller].mvc/[action]/[id]"
// to enable automatic support on IIS6
RouteTable.Routes.Add(new Route
{
Url = "[controller]/[action]/[id]",
Defaults = new { action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
RouteTable.Routes.Add(new Route
{
Url = "Default.aspx",
Defaults = new {
controller = "Home",
action = "Index",
id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
}
}
復制代碼 Url = "[controller]/[action]/[id]"
此默認路由是能讓我的 HiThere 方法得以調用的路由。請記住此 URL:http://localhost/Hello/HiThere/Chris?此路由將 Hello 與控制器、HiThere 與操作以及 Chris 與 ID 一一對應。MVC Framework 隨即創建 HelloController 實例,調用 HiThere 方法,然后將 Chris 作為 ID 參數的值傳遞。 此默認路由為您提供了許多功能,但您也可以添加自己的路由。例如,我想要一個真正友好的 站點,好友們只需輸入他們的姓名即可獲得個性化的問候。如果我在路由表的頂部添加以下路由 復制代碼 RouteTable.Routes.Add(new Route
{
Url = "[id]",
Defaults = new {
controller = "Hello",
action = "HiThere" },
RouteHandler = typeof(MvcRouteHandler)
});
隨后,我只需訪問 ,我的操作仍處于調用狀態,而我將會看到熟悉的友好問候。 系統如何知道調用哪個控制器和操作?答案是 Defaults 參數。它利用新的 C# 3.0 匿名類型語法來創建一個偽詞典。Route 上的 Defaults 對象可包含任意附加的信息,對于 MVC,它還可以包含一些眾所周知的條目:即控制器和操作。如果 URL 中沒有指定控制器或操作,則其將使用 Defaults 中的名稱。這就是為什么即使我在 URL 中忽略它們,但仍可以將我的請求映射到正確的控制器和操作。 還有一件事需要注意:還記得我說過“添加到表格的頂部”嗎?如果您將其置于底部,將會出 現錯誤。路由根據先到先得的原則進行工作。當處理 URL 時,路由系統會自上至下瀏覽表格,并且使用第一個匹配的路由。在本例中,默認路由 "[controller]/[action]/[id]" 匹配,因為它們是操作和 ID 的默認值。這樣,它會繼續查找 ChrisController,但我沒有控制器,因此會出現錯誤。
稍大的示例 現在,我已經說明了 MVC Framework 的基礎知識,將為您展示一個更大的示例,實現比僅顯示字符串更多的功能。wiki 是一種可以在瀏覽器中進行編輯的網站。可以輕松地添加或編輯頁面。我使用 MVC Framework 編寫了一個小型的示例 wiki。“編輯此頁面”屏幕如圖 7 所示。 Figure 7?編輯主頁?(單擊該 圖像獲得較大視圖) 您可以檢查本文的代碼下載以查看如何實現底層 wiki 邏輯。現在我想重點說明 MVC Framework 如何使 Web 上的 wiki 獲取變得簡單。讓我們先設計 URL 結構。我想要以下各項:
  • /[pagename] 顯示該名稱的頁面。
  • /[pagename]?version=n 顯示頁面的請求版本,其中 0 = 當前版本,1 = 以前的版本,以此類推。
  • /Edit/[pagename] 打開該頁的編輯屏幕。
  • /CreateNewVersion/[pagename] 是為提交編輯而傳入的 URL。
讓我們從 wiki 頁面的基本顯示開始。我為它創建了一個名為 WikiPageController 的新類。接下來,我會添加一個名為 ShowPage 的操作。啟動的 WikiPageController 如圖 8 所示。ShowPage 方法相當簡單。WikiSpace 和 WikiPage 類分別表示一組 wiki 頁面和特定的頁面(及其修訂)。此操作只需加載模型并調用 RenderView。但此處的 "new WikiPageViewData" 行是什么意思? ?Figure?8?WikiPageController Implementation of ShowPage 復制代碼 public class WikiPageController : Controller
{
ISpaceRepository repository;
public ISpaceRepository Repository
{
get {
if (repository == null)
{
repository = new FileBasedSpaceRepository(
Request.MapPath("~/WikiPages"));
}
return repository;
}
set { repository = value; }
}
[ControllerAction]
public void ShowPage(string pageName, int? version)
{
WikiSpace space = new WikiSpace(Repository);
WikiPage page = space.GetPage(pageName);
RenderView("showpage",
new WikiPageViewData
{
Name = pageName,
Page = page,
Version = version ?? 0
});
}
}
我前面的示例說明了一種將數據從控制器傳遞到視圖的方法:即 ViewData 詞典。詞典非常方便,但也很危險。它們幾乎包含一切內容,您不能獲取內容的任何 IntelliSense?,并且由于 ViewData 詞典屬于 Dictionary<string, object> 類型,它將消耗內容,您必須計算所有一切。 當您了解在視圖中將需要什么數據后,就可以傳遞強類型化的 ViewData 對象。在我的示例中,我創建了一個簡單的對象 (WikiPageViewData),如圖 9 中所示。此對象將 wiki 頁面信息帶到視圖,同時還攜帶了一些實用工具方法,執行獲取 wiki 標記的 HTML 版本這類任務。 ?Figure?9?WikiPageViewData Object 復制代碼 public class WikiPageViewData {
public string Name { get; set; }
public WikiPage Page { get; set; }
public int Version { get; set; }
public WikiPageViewData() {
Version = 0;
}
public string NewVersionUrl {
get {
return string.Format("/CreateNewVersion/{0}", Name);
}
}
public string Body {
get { return Page.Versions[Version].Body; }
}
public string HtmlBody {
get { return Page.Versions[Version].BodyAsHtml(); }
}
public string Creator {
get { return Page.Versions[Version].Creator; }
}
public string Tags {
get { return string.Join(",", Page.Versions[Version].Tags); }
}
}
現在,我已經定義了視圖數據,那么,我如何使用它呢?在 ShowPage.aspx.cs 中,您將看到以下內容: 復制代碼 namespace MiniWiki.Views.WikiPage {
public partial class ShowPage : ViewPage<WikiPageViewData>
{
}
}
請注意,我將基類類型定義為 ViewPage<WikiPageViewData>。這意味著頁面的 ViewData 屬性為 WikiPageViewData 類型,而不是象以前示例中的“Dictionary”。 .aspx 文件中的實際標記非常簡單: 復制代碼 <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
AutoEventWireup="true" CodeBehind="ShowPage.aspx.cs"
Inherits="MiniWiki.Views.WikiPage.ShowPage" %>
<asp:Content
ID="Content1"
ContentPlaceHolderID="MainContentPlaceHolder"
runat="server">
<h1><%= ViewData.Name %></h1>
<div id="content" class="wikiContent">
<%= ViewData.HtmlBody %>
</div>
</asp:Content>
請注意,當引用 ViewData 時,我沒有使用索引操作符 []。由于我現在有強類型化的 ViewData,我可以直接訪問該屬性。不需要進行任何計算,而 Visual Studio 會提供 IntelliSense。 目光敏銳的讀者將會注意到此文件中的 <asp:Content> 標記。沒錯,“母版頁”確實可以與 MVC 視圖配合使用。并且“母版頁”還可以成為視圖。讓我們看看“母版頁”的源代碼: 復制代碼 namespace MiniWiki.Views.Layouts
{
public partial class Site :
System.Web.Mvc.ViewMasterPage<WikiPageViewData>
{
}
}
相關標記如圖 10 中所示。現在,“母版頁”將獲得與視圖完全相同的 ViewData 對象。我已經將“母版頁”的基類聲明為 ViewMasterPage<WikiPageViewData>,因此,我擁有了正確類型的 ViewData。我會在那里設置各種 DIV 標記以對頁面進行布局,填寫版本列表,然后以常用內容占位符收尾。 ?Figure?10?Site.Master 復制代碼 <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="MiniWiki.Views.Layouts.Site" %> <%@ Import Namespace="MiniWiki.Controllers" %> <%@ Import Namespace="MiniWiki.DomainModel" %> <%@ Import Namespace="System.Web.Mvc" %> <html > <head runat="server"> <title><%= ViewData.Name %></title> <link href="http://http://www.cnblogs.com/Content/Site.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="inner"> <div id="top"> <div id="header"> <h1><%= ViewData.Name %></h1> </div> <div id="menu"> <ul> <li><a href="http://Home">Home</a></li> <li> <%= Html.ActionLink("Edit this page", new { controller = "WikiPage", action = "EditPage", pageName = ViewData.Name })%> </ul> </div> </div> <div id="main"> <div id="revisions"> Revision history: <ul> <% int i = 0; foreach (WikiPageVersion version in ViewData.Page.Versions) { %> <li> <a href="http://<%= ViewData.Name %>?version=<%= i %>"> <%= version.CreatedOn %> by <%= version.Creator %> </a> </li> <% ++i; } %> </ul> </div> <div id="maincontent"> <asp:ContentPlaceHolder ID="MainContentPlaceHolder" runat="server"> </asp:ContentPlaceHolder> </div> </div> </div> </body> </html> 另一件需要注意的事是對 Html.ActionLink 的調用。以下是呈現幫助程序的一個示例。各種視圖類均具有兩種屬性,Html 和 Url。每種均有輸出 HTML 代碼塊的有用方法。在本例中,Html.ActionLink 獲取一個對象(此處為匿名類型)并通過路由系統將其返回。這將會生成一個 URL,該 URL 將路由至我指定的控制器和操作。這樣一來,無論我如何更改路由,“編輯此頁面”鏈接將始終指向正確的位置。 您可能還注意到,我還不得不依靠手動構建鏈接(到先前頁面版本的鏈接)。遺憾的是,當前 的路由系統在涉及查詢字符串時生成 URL 的功能不是十分完善。這應會在框架的后續版本中得到修復。
創建表單和回發 現在,讓我們看看控制器上的 EditPage 操作: 復制代碼 [ControllerAction]
public void EditPage(string pageName)
{
WikiSpace space = new WikiSpace(Repository);
WikiPage page = space.GetPage(pageName);
RenderView("editpage",
new WikiPageViewData {
Name = pageName,
Page = page });
}
同樣,該操作所做的不多—它只是呈現指定頁面的視圖。視圖中的內容變得更加有趣,如圖 11 中所示。此文件構建了一個 HTML 表單,但沒有出現 Runat="server"。Url.Action helper 用于生成表單回發的 URL。其中還使用了幾種不同的 HTML 幫助程序(如 TextBox、TextArea 和 SubmitButton)。它們會出色完成您的預期目標:為各種輸入字段生成 HTML。 ?Figure?11?EditPage.aspx 復制代碼 <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="EditPage.aspx.cs" Inherits="MiniWiki.Views.WikiPage.EditPage" %> <%@ Import Namespace="System.Web.Mvc" %> <%@ Import Namespace="MiniWiki.Controllers" %> <asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server"> <form action="<%= Url.Action( new { controller = "WikiPage", action = "NewVersion", pageName = ViewData.Name })%>" method=post> <% if (ViewContext.TempData.ContainsKey("errors")) { %> <div id="errorlist"> <ul> <% foreach (string error in (string[])ViewContext.TempData["errors"]) { %> <li><%= error%></li> <% } %> </ul> </div> <% } %> Your name: <%= Html.TextBox("Creator", ViewContext.TempData.ContainsKey("creator") ? (string)ViewContext.TempData["creator"] : ViewData.Creator)%> <br /> Please enter your updates here:<br /> <%= Html.TextArea("Body", ViewContext.TempData.ContainsKey("body") ? (string)ViewContext.TempData["body"] : ViewData.Body, 30, 65)%> <br /> Tags: <%= Html.TextBox( "Tags", ViewContext.TempData.ContainsKey("tags") ? (string)ViewContext.TempData["tags"] : ViewData.Tags)%> <br /> <%= Html.SubmitButton("SubmitAction", "OK")%> <%= Html.SubmitButton("SubmitAction", "Cancel")%> </form> </asp:Content> 處理 Web 編程最頭疼的事情之一就是表單中的錯誤。更確切地說,您想要顯示錯誤信息,但同時想要保留原來輸入的數據。我們都有過那種經歷,在填寫一張有 35 個字段的表單時出現一個錯誤,程序卻只是提供一堆錯誤信息和一張新的空白表單。MVC Framework 使用 TempData 存儲以前輸入信息,以便可以重新填入表單。這是 ViewState 實際上在 Web 窗體中變得非常簡單的原因,因為保存控件的內容幾乎是自動的。 我想在 MVC 中如法炮制,因此引入了 TempData。TempData 是一種詞典,與非類型化的 ViewData 很相似。不過,TempData 的內容僅針對單一請求存在,隨后就會被刪除。要了解如何使用此方法,請參閱圖 12,NewVersion 操作。 ?Figure?12?NewVersion Action 復制代碼 [ControllerAction] public void NewVersion(string pageName) { NewVersionPostData postData = new NewVersionPostData(); postData.UpdateFrom(Request.Form); if (postData.SubmitAction == "OK") { if (postData.Errors.Length == 0) { WikiSpace space = new WikiSpace(Repository); WikiPage page = space.GetPage(pageName); WikiPageVersion newVersion = new WikiPageVersion( postData.Body, postData.Creator, postData.TagList); page.Add(newVersion); } else { TempData["creator"] = postData.Creator; TempData["body"] = postData.Body; TempData["tags"] = postData.Tags; TempData["errors"] = postData.Errors; RedirectToAction(new { controller = "WikiPage", action = "EditPage", pageName = pageName }); return; } } RedirectToAction(new { controller = "WikiPage", action = "ShowPage", pageName = pageName }); } 首先,它創建一個 NewVersionPostData 對象。這是另一個幫助程序對象,具有存儲記入的內容和進行某些驗證的屬性和方法。為加載 postData 對象,我將使用 MVC 工具包的幫助程序。UpdateFrom 實際上是工具包提供的擴展方法,它使用反射將表單字段的名稱與我的對象中屬性的名稱相對映。最終結果是,所有字段值均載入到我的 postData 對象中。不過,UpdateFrom 使用起來確實有缺點,由于它直接從 HttpRequest 獲取表單數據,使單元測試變得更為困難。 NewVersion 檢查的第一項是 SubmitAction。如果用戶單擊“確定”按鈕并確實想要發布編輯的頁面,則此項檢查將通過。如果此處有任何其它值,操作會重定向回 ShowPage,只是重新顯示原來的頁面。 如果用戶確實單擊了“確定”,則檢查 postData.Errors 屬性。這將在記入內容上運行一些簡單的驗證。如果沒有任何錯誤,我會將新版本的頁面重新寫入 wiki。不過,如果出現錯誤,情況會變得饒有趣味。 如果出現錯誤,我會設置 TempData 詞典的各個字段,以便其包含 PostData 的內容。然后,我會重定向回“編輯”頁面。現在,由于已設置 TempData,頁面將重新顯示以用戶上次記入的值初始化的表單。 處理記入、驗證和 TempData 的這個過程現在變得有些煩瑣,并且需要多做一些手動工作。將來發行的版本應包括至少會將一些 TempData 檢查自動化的幫助程序方法。關于 TempData 的最后一個注意事項是:TempData 的內容存儲在用戶的服務器端會話中。如果您關閉會話,TempData 將無法正常工作。
創建控制器 現在,wiki 的基礎已在發揮功效,但繼續進行之前,我想要明確實現中的以下幾個要點。例如,Repository 屬性用于分離 wiki 的邏輯與物理存儲。您可以提供在文件系統(正如我所做的那樣)、數據庫或您想要的任何位置中存儲內容的存儲庫。遺憾的是,我需要解決兩個問題。 首先,我的控制器類與具體的 FileBasedSpaceRepository 類緊密地連在一起。我需要一個默認值,以便在屬性沒有設置時,也能合理使用。更糟的是,磁盤上文件的路徑在這里也是硬編碼的。最起碼,它應取自配置。 其次,我的對象必須依賴存儲庫,否則無法運行。對于良好的設計,存儲庫實際應為構造函數 參數,而不是屬性。但我無法將其添加到構造函數中,因為 MVC Framework 要求控制器上的構造函數不能有參數。 幸運的是,我可以通過一個擴展性掛接擺脫此限制:即控制器工廠。控制器工廠的功能正如其 名稱所指:它創建 Controller 實例。您只需要創建一個類實現 IControllerFactory 接口并向 MVC 系統注冊即可。您可以為所有控制器或僅為指定的類型注冊控制器工廠。圖 13 所示為 WikiPageController 的控制器工廠,其現在將存儲庫作為構造函數參數傳遞。在這種情況下,實現非常煩瑣,但它可以創建能使用更強大工具(特別是依賴關系注入容器)的控制器。 無論如何,現在我擁有了將控制器依賴關系分離到對象中(易于管理和維護)的所有詳細信息。 ?Figure?13?Controller Factory 復制代碼 public class WikiPageControllerFactory : IControllerFactory { public IController CreateController(RequestContext context, Type controllerType) { return new WikiPageController( GetConfiguredRepository(context.HttpContext.Request)); } private ISpaceRepository GetConfiguredRepository(IHttpRequest request) { return new FileBasedSpaceRepository(request.MapPath("~/WikiPages")); } } 此工作的最后一步是向框架注冊工廠。通過 ControllerBuilder 類可進行此操作,方法是將以下行添加到 Application_Start 方法中的 Global.asax.cs(路由前后均可): 復制代碼 ControllerBuilder.Current.SetControllerFactory(
typeof(WikiPageController), typeof(WiliPageControllerFactory));
這將注冊 WikiPageController 的工廠。如果此項目中有其他控制器,它們不會使用此工廠,因為此工廠僅針對 WikiPageController 類型進行了注冊。如果您想要將工廠設置為供所有控制器使用,還可以調用 SetDefaultControllerFactory。
其他擴展點 控制器工廠只是框架擴展性的起點。本文中無法詳述所有的細節,因此我將僅僅說明要點。首 先,如果您想要輸出的內容不是 HTML,或想要使用其他模板引擎而不是 Web 窗體,可將控制器的 ViewFactory 設為其他項。您可以實現 IviewFactory 界面,然后即可完全控制如何生成輸出。這對于生成 RSS、XML 或圖形非常有用。 正如您所見到的,路由系統非常靈活。但路由系統中沒有任何內容是 MVC 專用的。每個路由均有一個 RouteHandler 屬性;目前為止,我始終將其設為 MvcRouteHandler。但可以實現 IRouteHandler 界面并將路由系統與其他 Web 技術掛接。將來推出的框架將附帶 WebFormsRouteHandler,并且其他技術也會在將來利用通用路由系統的優勢。 控制器并非必須從 System.Web.Mvc.Controller 衍生。控制器需要做的僅僅是實現 IController 界面,該界面只有稱為 Execute 的一種方法。您可以從中進行任何操作。另一方面,如果您想將 Controller 基類的幾種行為組合在一起,您可以覆蓋 Controller 的許多虛擬函數:
  • OnPreAction、OnPostAction 和 OnError 可讓您將每個已執行操作上的預處理和后處理連接起來。OnError 為您提供在控制器內處理錯誤的機制。
  • 當 URL 路由到控制器但控制器沒有實現路由中請求的操作時,會調用 HandleUnknownAction。默認情況下,此方法會拋出一個異常,但您可以用所需的操作覆蓋默認值。
  • InvokeAction 是一種方法,它負責解決調用何種操作方法并進行調用。如果您想要自定義過程(例如,除去 [ControllerAction] 屬性的要求),應使用該方法。
還有其他幾種針對 Controller 的虛擬方法,但這些方法主要是測試掛接而不是作為擴展點。例如,RedirectToAction 是虛擬的,因此您可以創建實際并不進行重定向的衍生類。這樣,您不需要完全運行 Web 服務器就能測試重定向操作。
要告別 Web 窗體嗎? 現在您可能在想:“Web 窗體會面臨怎樣的命運?MVC 會取代它嗎?”答案是否定的!Web 窗體是一種普及技術,Microsoft 將繼續支持并改進它。它在許多應用程序中發揮著重要的作用;例如,可使用 Web 窗體創建典型的 Intranet 數據庫報表應用程序,所花的時間比使用 MVC 編寫短得多。此外,Web 窗體支持大量的控件,許多控件均具備非常先進的功能,可以大大提高效率。 那么,什么時候應該選擇 MVC 呢?這主要取決于您的要求和喜好。您是否正在為獲得想要的 URL 格式而煩惱?您是否想要對 UI 進行單元測試?以上情況均需要依靠 MVC。反之,如果您要顯示許多數據,提供可編輯的網格和優良的樹形視圖控件?那么,您暫時最好還是使用 Web 窗體。 今后,MVC Framework 很可能在 UI 控制部分有所改進,但在便利性上,它可能始終不及 Web 窗體,因為后者具備大量拖曳功能。同時,ASP.NET MVC Framework 為 Web 開發人員提供了一種在 Microsoft .NET Framework 中構建 Web 應用程序的新方法。Framework 針對可測試性設計、推倡使用 HTTP 并且幾乎在每個點均可擴展。對于那些想要完全控制其 Web 應用程序的開發人員來說,這是一個對 Web 窗體的誘人補充。
Chris Tavares 是 Microsoft 模式和實施方案小組的一名開發人員,他致力于幫助開發社區了解在 Microsoft 平臺上構建系統的最佳實踐。他還是 ASP.NET MVC 小組的虛擬成員,幫助您設計新的框架。可以通過 cct@tavaresstudios.com 與 Chris 取得聯系。

轉載于:https://www.cnblogs.com/bndy/archive/2010/07/19/1780491.html

總結

以上是生活随笔為你收集整理的ASP.NET MVC: 构建不带 Web 窗体的 Web 应用程序(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

偷窥日本少妇撒尿chinese | 18无码粉嫩小泬无套在线观看 | 免费网站看v片在线18禁无码 | 亚洲精品综合一区二区三区在线 | 天堂无码人妻精品一区二区三区 | 熟妇人妻激情偷爽文 | 久热国产vs视频在线观看 | 在线观看欧美一区二区三区 | 亚洲综合在线一区二区三区 | 日本一卡2卡3卡四卡精品网站 | 日韩av无码一区二区三区 | 亚洲中文字幕无码一久久区 | 国产亚洲人成在线播放 | 国产精品毛片一区二区 | 中文无码精品a∨在线观看不卡 | 国产黄在线观看免费观看不卡 | 东京热一精品无码av | 熟妇人妻中文av无码 | 日日橹狠狠爱欧美视频 | 无遮挡啪啪摇乳动态图 | 亚洲熟妇色xxxxx亚洲 | 精品久久久久久亚洲精品 | 亚洲日韩精品欧美一区二区 | 久久综合九色综合欧美狠狠 | 免费网站看v片在线18禁无码 | 国产精品久久久久久久影院 | 人人妻人人澡人人爽欧美精品 | 国产高清av在线播放 | 国产又粗又硬又大爽黄老大爷视 | 亚洲小说春色综合另类 | 奇米影视7777久久精品人人爽 | 狠狠色色综合网站 | 日本成熟视频免费视频 | 少妇厨房愉情理9仑片视频 | 我要看www免费看插插视频 | 蜜桃臀无码内射一区二区三区 | 兔费看少妇性l交大片免费 | 欧美色就是色 | 日本肉体xxxx裸交 | 中文字幕色婷婷在线视频 | aⅴ在线视频男人的天堂 | 国产另类ts人妖一区二区 | 人人妻人人藻人人爽欧美一区 | 麻豆国产丝袜白领秘书在线观看 | 青青草原综合久久大伊人精品 | 国产精品人妻一区二区三区四 | 亚洲小说春色综合另类 | 国产偷抇久久精品a片69 | 高清无码午夜福利视频 | 捆绑白丝粉色jk震动捧喷白浆 | 欧美乱妇无乱码大黄a片 | 久久人人爽人人爽人人片av高清 | 国产成人久久精品流白浆 | 18无码粉嫩小泬无套在线观看 | 中文字幕av无码一区二区三区电影 | 成人性做爰aaa片免费看不忠 | 乱码av麻豆丝袜熟女系列 | 精品无码一区二区三区爱欲 | 曰韩少妇内射免费播放 | 精品无码国产自产拍在线观看蜜 | 久久精品中文字幕大胸 | 日本高清一区免费中文视频 | 亚洲va中文字幕无码久久不卡 | 久久国产精品萌白酱免费 | 国产亚洲美女精品久久久2020 | 噜噜噜亚洲色成人网站 | 亚洲码国产精品高潮在线 | 亚洲国产精品久久人人爱 | 97夜夜澡人人爽人人喊中国片 | 在线观看免费人成视频 | 亚洲啪av永久无码精品放毛片 | 国产热a欧美热a在线视频 | 在线观看国产一区二区三区 | 99久久无码一区人妻 | 乌克兰少妇xxxx做受 | 亚洲精品久久久久avwww潮水 | 午夜精品一区二区三区在线观看 | 狂野欧美性猛交免费视频 | 中文字幕 亚洲精品 第1页 | аⅴ资源天堂资源库在线 | 国产综合久久久久鬼色 | 亚洲男女内射在线播放 | 无码午夜成人1000部免费视频 | 国产熟妇高潮叫床视频播放 | 亚洲呦女专区 | av无码久久久久不卡免费网站 | 无套内谢的新婚少妇国语播放 | 少妇人妻av毛片在线看 | 国产香蕉尹人综合在线观看 | 国产精品高潮呻吟av久久 | 青草青草久热国产精品 | 欧美freesex黑人又粗又大 | 午夜精品一区二区三区的区别 | 国产精品久久久午夜夜伦鲁鲁 | 学生妹亚洲一区二区 | 麻豆国产丝袜白领秘书在线观看 | 丰满人妻一区二区三区免费视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 女人色极品影院 | 欧美日韩精品 | 国产一区二区不卡老阿姨 | 熟女少妇在线视频播放 | 狠狠色噜噜狠狠狠狠7777米奇 | 奇米影视888欧美在线观看 | 亚洲欧美精品伊人久久 | 亚洲日韩av一区二区三区四区 | 男女爱爱好爽视频免费看 | 奇米影视7777久久精品 | 水蜜桃亚洲一二三四在线 | 欧美猛少妇色xxxxx | 色婷婷欧美在线播放内射 | 大肉大捧一进一出好爽视频 | 国产亲子乱弄免费视频 | 国产成人综合色在线观看网站 | 国产av无码专区亚洲a∨毛片 | 亚洲春色在线视频 | 国产精品沙发午睡系列 | 精品国产精品久久一区免费式 | 奇米影视7777久久精品人人爽 | 欧美性生交活xxxxxdddd | 亚洲精品中文字幕 | 2020久久超碰国产精品最新 | 久久久久久av无码免费看大片 | 少妇愉情理伦片bd | 亚洲一区av无码专区在线观看 | 一本色道久久综合亚洲精品不卡 | 久精品国产欧美亚洲色aⅴ大片 | 51国偷自产一区二区三区 | 国产一区二区三区精品视频 | 麻豆成人精品国产免费 | 色一情一乱一伦一视频免费看 | 又色又爽又黄的美女裸体网站 | 久久午夜无码鲁丝片秋霞 | 国产无av码在线观看 | 亚洲欧洲日本无在线码 | 久久亚洲精品中文字幕无男同 | 一区二区三区乱码在线 | 欧洲 | 中文字幕乱码人妻二区三区 | 99久久精品无码一区二区毛片 | 国产做国产爱免费视频 | 亚洲高清偷拍一区二区三区 | 日本熟妇大屁股人妻 | 丰满人妻精品国产99aⅴ | 国产熟妇另类久久久久 | 久久视频在线观看精品 | 欧美第一黄网免费网站 | 亚洲va欧美va天堂v国产综合 | 亚洲国产精品久久人人爱 | 97精品国产97久久久久久免费 | 亚洲国产欧美在线成人 | 亚洲春色在线视频 | 中文字幕精品av一区二区五区 | 蜜桃无码一区二区三区 | 色老头在线一区二区三区 | 天堂а√在线地址中文在线 | 国产成人无码区免费内射一片色欲 | 一本久道久久综合狠狠爱 | 粉嫩少妇内射浓精videos | 国产午夜亚洲精品不卡下载 | 欧洲美熟女乱又伦 | 婷婷综合久久中文字幕蜜桃三电影 | 四虎4hu永久免费 | 奇米影视7777久久精品人人爽 | 全球成人中文在线 | 免费无码av一区二区 | 久久人人爽人人爽人人片av高清 | 东京一本一道一二三区 | 国产精品多人p群无码 | 亚洲综合另类小说色区 | 日本www一道久久久免费榴莲 | 亚洲一区二区观看播放 | 久久人人爽人人爽人人片av高清 | 51国偷自产一区二区三区 | 色五月丁香五月综合五月 | 中文精品无码中文字幕无码专区 | 亚洲精品午夜无码电影网 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲成av人在线观看网址 | 少妇无套内谢久久久久 | 国产一精品一av一免费 | 99国产欧美久久久精品 | 色婷婷香蕉在线一区二区 | 国产莉萝无码av在线播放 | 亚洲国产精品久久人人爱 | 欧美日韩综合一区二区三区 | 天天av天天av天天透 | 国产精品久久久久久久影院 | 国产一区二区三区四区五区加勒比 | 亚洲春色在线视频 | 亚洲一区av无码专区在线观看 | 久久精品99久久香蕉国产色戒 | 一区二区传媒有限公司 | 国产日产欧产精品精品app | 人妻与老人中文字幕 | 欧美日本精品一区二区三区 | 18黄暴禁片在线观看 | 国产三级精品三级男人的天堂 | 精品夜夜澡人妻无码av蜜桃 | 亚洲国产午夜精品理论片 | 色综合久久久久综合一本到桃花网 | 久久综合给合久久狠狠狠97色 | 牛和人交xxxx欧美 | 67194成是人免费无码 | 日本肉体xxxx裸交 | 国产av剧情md精品麻豆 | 麻豆果冻传媒2021精品传媒一区下载 | 久久精品国产精品国产精品污 | 粉嫩少妇内射浓精videos | 99精品视频在线观看免费 | 夜精品a片一区二区三区无码白浆 | 一本久久a久久精品vr综合 | 人人妻在人人 | 美女黄网站人色视频免费国产 | 图片小说视频一区二区 | 国产亚洲精品久久久久久国模美 | 国产舌乚八伦偷品w中 | 亚洲中文字幕av在天堂 | 日日摸天天摸爽爽狠狠97 | 亚洲伊人久久精品影院 | 丰满诱人的人妻3 | 无码人妻精品一区二区三区下载 | 无码人妻久久一区二区三区不卡 | 无码人妻久久一区二区三区不卡 | 国产色视频一区二区三区 | 国产国产精品人在线视 | 无码纯肉视频在线观看 | 亚洲一区二区三区无码久久 | 国内老熟妇对白xxxxhd | 窝窝午夜理论片影院 | 久久国产精品萌白酱免费 | 亚洲国产欧美日韩精品一区二区三区 | 国产午夜精品一区二区三区嫩草 | 色综合久久中文娱乐网 | 日本一区二区三区免费播放 | 欧美性生交活xxxxxdddd | 日本高清一区免费中文视频 | 日本精品人妻无码免费大全 | 久久五月精品中文字幕 | 亚洲国产精品一区二区美利坚 | 色情久久久av熟女人妻网站 | 欧美日韩综合一区二区三区 | 国产9 9在线 | 中文 | 学生妹亚洲一区二区 | 亚洲日韩精品欧美一区二区 | 日本xxxx色视频在线观看免费 | 日韩精品乱码av一区二区 | 欧美真人作爱免费视频 | 国产午夜亚洲精品不卡 | 亚洲成熟女人毛毛耸耸多 | 高清不卡一区二区三区 | 高潮毛片无遮挡高清免费视频 | 国产成人无码区免费内射一片色欲 | 国产sm调教视频在线观看 | 高中生自慰www网站 | 亚洲综合精品香蕉久久网 | 妺妺窝人体色www在线小说 | a片免费视频在线观看 | 国产av久久久久精东av | 中文字幕无线码免费人妻 | 欧洲精品码一区二区三区免费看 | 欧美激情综合亚洲一二区 | 国产成人精品三级麻豆 | 无码人妻av免费一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 正在播放东北夫妻内射 | 国产成人人人97超碰超爽8 | 十八禁视频网站在线观看 | 1000部啪啪未满十八勿入下载 | 久久综合九色综合97网 | 中国女人内谢69xxxx | 国产97人人超碰caoprom | 麻豆国产97在线 | 欧洲 | 亚洲欧洲日本综合aⅴ在线 | 欧美野外疯狂做受xxxx高潮 | 亚洲精品国产第一综合99久久 | 色综合久久中文娱乐网 | 无码人妻丰满熟妇区五十路百度 | 免费国产成人高清在线观看网站 | 精品国产青草久久久久福利 | 精品久久8x国产免费观看 | 国产 精品 自在自线 | 久久久久成人片免费观看蜜芽 | 熟妇人妻无乱码中文字幕 | 丰满妇女强制高潮18xxxx | 亚洲精品一区二区三区四区五区 | 国产人妻久久精品二区三区老狼 | 狠狠色噜噜狠狠狠狠7777米奇 | 精品厕所偷拍各类美女tp嘘嘘 | 国产 精品 自在自线 | 亚洲中文字幕乱码av波多ji | 久久综合给久久狠狠97色 | 野狼第一精品社区 | 无码av免费一区二区三区试看 | 水蜜桃色314在线观看 | 国产亚洲人成在线播放 | 久久精品丝袜高跟鞋 | 亚洲国产欧美日韩精品一区二区三区 | 色诱久久久久综合网ywww | 亚洲色欲久久久综合网东京热 | 精品国产一区av天美传媒 | 性欧美熟妇videofreesex | 黑人大群体交免费视频 | 国産精品久久久久久久 | 丝袜人妻一区二区三区 | 男女猛烈xx00免费视频试看 | 内射欧美老妇wbb | 亚洲一区二区三区四区 | 亚洲精品中文字幕乱码 | 大地资源网第二页免费观看 | 久久99久久99精品中文字幕 | 老子影院午夜精品无码 | 狠狠亚洲超碰狼人久久 | 亚洲精品一区二区三区婷婷月 | 国产人妖乱国产精品人妖 | 撕开奶罩揉吮奶头视频 | 日本www一道久久久免费榴莲 | 国产成人午夜福利在线播放 | 日日天干夜夜狠狠爱 | 国产精品怡红院永久免费 | 国产超级va在线观看视频 | 国产精品高潮呻吟av久久4虎 | 内射欧美老妇wbb | 无码一区二区三区在线观看 | 亚洲欧洲日本综合aⅴ在线 | 国精品人妻无码一区二区三区蜜柚 | 国产人成高清在线视频99最全资源 | 六十路熟妇乱子伦 | 特大黑人娇小亚洲女 | 国产亚洲精品久久久久久国模美 | 国产明星裸体无码xxxx视频 | 亚洲人亚洲人成电影网站色 | 日本一区二区三区免费播放 | 亚洲乱码国产乱码精品精 | 久久亚洲中文字幕精品一区 | 一个人看的www免费视频在线观看 | 久久综合激激的五月天 | 色窝窝无码一区二区三区色欲 | 一本无码人妻在中文字幕免费 | 成人试看120秒体验区 | 亚洲人成影院在线无码按摩店 | 色婷婷综合激情综在线播放 | 亚洲男人av香蕉爽爽爽爽 | 欧美日韩一区二区三区自拍 | 国产农村妇女高潮大叫 | 99精品国产综合久久久久五月天 | 少妇性l交大片欧洲热妇乱xxx | 久久熟妇人妻午夜寂寞影院 | 国产乱人伦偷精品视频 | 久久精品一区二区三区四区 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产午夜无码视频在线观看 | 日本一本二本三区免费 | 中文字幕日产无线码一区 | 99国产精品白浆在线观看免费 | 国产色xx群视频射精 | 无码人妻丰满熟妇区五十路百度 | 最新国产乱人伦偷精品免费网站 | 欧洲熟妇精品视频 | 精品国产青草久久久久福利 | 日本xxxx色视频在线观看免费 | 欧美人与禽zoz0性伦交 | 嫩b人妻精品一区二区三区 | 三上悠亚人妻中文字幕在线 | 国产真人无遮挡作爱免费视频 | 久久久久国色av免费观看性色 | 亚洲精品一区二区三区在线观看 | 综合激情五月综合激情五月激情1 | 18禁黄网站男男禁片免费观看 | 少妇人妻偷人精品无码视频 | 欧美人与禽zoz0性伦交 | 亚洲日韩av片在线观看 | 久久久中文字幕日本无吗 | 国内精品一区二区三区不卡 | 国产无遮挡吃胸膜奶免费看 | 亚洲男女内射在线播放 | 亚洲欧美日韩国产精品一区二区 | 亚洲精品成a人在线观看 | 中文字幕乱码亚洲无线三区 | 久久久久亚洲精品男人的天堂 | 男女性色大片免费网站 | 成人亚洲精品久久久久 | 一本色道婷婷久久欧美 | 精品亚洲韩国一区二区三区 | 网友自拍区视频精品 | 国产精品无码一区二区三区不卡 | 久久人人爽人人爽人人片av高清 | 亚洲精品国产品国语在线观看 | 性欧美熟妇videofreesex | 娇妻被黑人粗大高潮白浆 | 黄网在线观看免费网站 | 久久久久成人片免费观看蜜芽 | 国内精品人妻无码久久久影院蜜桃 | 国产乱人无码伦av在线a | 少妇邻居内射在线 | 国产午夜无码视频在线观看 | 亚洲一区二区三区国产精华液 | 亚洲人成网站在线播放942 | 成人免费视频视频在线观看 免费 | 久久国产精品精品国产色婷婷 | 精品人人妻人人澡人人爽人人 | 久久久婷婷五月亚洲97号色 | 国产精品丝袜黑色高跟鞋 | 99国产精品白浆在线观看免费 | 十八禁视频网站在线观看 | 乱码av麻豆丝袜熟女系列 | 国产成人精品视频ⅴa片软件竹菊 | 香蕉久久久久久av成人 | 国产成人无码午夜视频在线观看 | 无人区乱码一区二区三区 | 强奷人妻日本中文字幕 | 久久zyz资源站无码中文动漫 | 无码福利日韩神码福利片 | 性欧美videos高清精品 | 天堂在线观看www | 强辱丰满人妻hd中文字幕 | 俺去俺来也www色官网 | av无码久久久久不卡免费网站 | 中文字幕日产无线码一区 | 免费观看激色视频网站 | 日韩人妻无码一区二区三区久久99 | 免费国产成人高清在线观看网站 | 97资源共享在线视频 | 亚洲熟妇色xxxxx欧美老妇y | 四虎永久在线精品免费网址 | 999久久久国产精品消防器材 | 久久久久99精品国产片 | 中文精品无码中文字幕无码专区 | 久久精品人人做人人综合试看 | 国产av一区二区精品久久凹凸 | 国产网红无码精品视频 | 国产成人av免费观看 | 久久久久久久女国产乱让韩 | 日日夜夜撸啊撸 | 成人欧美一区二区三区黑人免费 | 国产精品高潮呻吟av久久4虎 | 一本大道久久东京热无码av | 久久综合激激的五月天 | 欧美真人作爱免费视频 | 国产精品高潮呻吟av久久4虎 | 又色又爽又黄的美女裸体网站 | 色窝窝无码一区二区三区色欲 | 成人欧美一区二区三区黑人免费 | 国产精品亚洲五月天高清 | 国产网红无码精品视频 | 毛片内射-百度 | 强开小婷嫩苞又嫩又紧视频 | 乱人伦人妻中文字幕无码久久网 | 人妻尝试又大又粗久久 | 四虎永久在线精品免费网址 | 夜夜夜高潮夜夜爽夜夜爰爰 | 2020最新国产自产精品 | 牲欲强的熟妇农村老妇女视频 | 中文无码成人免费视频在线观看 | 青青久在线视频免费观看 | 蜜桃视频插满18在线观看 | 国产精品18久久久久久麻辣 | 国色天香社区在线视频 | 青春草在线视频免费观看 | 亚洲の无码国产の无码步美 | а√资源新版在线天堂 | 3d动漫精品啪啪一区二区中 | 无码成人精品区在线观看 | 日韩精品a片一区二区三区妖精 | 中文字幕无码视频专区 | 久久久婷婷五月亚洲97号色 | 亚洲综合久久一区二区 | 久久精品人妻少妇一区二区三区 | 熟妇人妻中文av无码 | а√资源新版在线天堂 | 东京无码熟妇人妻av在线网址 | 4hu四虎永久在线观看 | 免费无码午夜福利片69 | 国产精品无码成人午夜电影 | 亚洲va欧美va天堂v国产综合 | 男女作爱免费网站 | 东京热无码av男人的天堂 | 草草网站影院白丝内射 | 国产激情艳情在线看视频 | 亚洲国产精品美女久久久久 | 日韩少妇白浆无码系列 | 国产综合久久久久鬼色 | 久久久www成人免费毛片 | 免费国产黄网站在线观看 | 红桃av一区二区三区在线无码av | 中文无码成人免费视频在线观看 | 少妇激情av一区二区 | 无码人妻精品一区二区三区不卡 | 国产极品美女高潮无套在线观看 | 精品欧美一区二区三区久久久 | 国产精品视频免费播放 | 国产真人无遮挡作爱免费视频 | 又色又爽又黄的美女裸体网站 | 免费播放一区二区三区 | 国产精品人人妻人人爽 | 国产亚洲精品精品国产亚洲综合 | 亚洲经典千人经典日产 | 亚洲精品国产第一综合99久久 | 亚洲精品中文字幕久久久久 | 久久精品国产99久久6动漫 | 日韩精品乱码av一区二区 | 成人无码影片精品久久久 | 国产偷国产偷精品高清尤物 | 国产人妻人伦精品1国产丝袜 | 老太婆性杂交欧美肥老太 | 久久精品国产一区二区三区 | 最近免费中文字幕中文高清百度 | 丝袜足控一区二区三区 | 玩弄人妻少妇500系列视频 | 天天躁日日躁狠狠躁免费麻豆 | 欧美国产亚洲日韩在线二区 | 亚洲日本va中文字幕 | 欧美黑人乱大交 | 人人妻在人人 | 一本色道久久综合亚洲精品不卡 | 国产做国产爱免费视频 | aⅴ亚洲 日韩 色 图网站 播放 | 日本一卡二卡不卡视频查询 | 久久精品国产一区二区三区肥胖 | 波多野结衣av在线观看 | 一二三四在线观看免费视频 | 国产 浪潮av性色四虎 | 黑人巨大精品欧美黑寡妇 | 捆绑白丝粉色jk震动捧喷白浆 | 99麻豆久久久国产精品免费 | 国产精品久久久久无码av色戒 | 无码国产色欲xxxxx视频 | 欧美人与牲动交xxxx | 亚洲aⅴ无码成人网站国产app | 国产精品久久久午夜夜伦鲁鲁 | 国产明星裸体无码xxxx视频 | 无码午夜成人1000部免费视频 | 亚洲精品午夜无码电影网 | 亚洲综合另类小说色区 | 亚洲国产av美女网站 | 日本一卡二卡不卡视频查询 | 国产美女精品一区二区三区 | 精品人妻中文字幕有码在线 | 麻花豆传媒剧国产免费mv在线 | 国产成人无码一二三区视频 | 免费无码一区二区三区蜜桃大 | 精品少妇爆乳无码av无码专区 | 国产两女互慰高潮视频在线观看 | 99久久精品日本一区二区免费 | 日韩精品无码一区二区中文字幕 | 无码人妻丰满熟妇区五十路百度 | 国产色精品久久人妻 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久五月精品中文字幕 | 国产亚洲精品久久久久久大师 | 欧美亚洲日韩国产人成在线播放 | 97人妻精品一区二区三区 | 欧洲vodafone精品性 | 成人无码影片精品久久久 | 久久久久99精品成人片 | 精品无码av一区二区三区 | 97久久国产亚洲精品超碰热 | 对白脏话肉麻粗话av | 一个人免费观看的www视频 | 国产特级毛片aaaaaaa高清 | 中国女人内谢69xxxxxa片 | 无码人妻出轨黑人中文字幕 | 天天躁日日躁狠狠躁免费麻豆 | 好男人www社区 | 国产精品-区区久久久狼 | 中文亚洲成a人片在线观看 | 午夜精品一区二区三区的区别 | ass日本丰满熟妇pics | 欧洲极品少妇 | 亚洲啪av永久无码精品放毛片 | 最近的中文字幕在线看视频 | 国产亚洲人成在线播放 | 中文毛片无遮挡高清免费 | 日本肉体xxxx裸交 | 久久精品视频在线看15 | 久久午夜夜伦鲁鲁片无码免费 | 国产超碰人人爽人人做人人添 | 亲嘴扒胸摸屁股激烈网站 | 精品久久8x国产免费观看 | 国产精品亚洲а∨无码播放麻豆 | 精品国产一区二区三区四区在线看 | 丝袜 中出 制服 人妻 美腿 | 亚洲国产高清在线观看视频 | 俺去俺来也在线www色官网 | 精品久久久中文字幕人妻 | 日日碰狠狠躁久久躁蜜桃 | 亚洲日韩一区二区三区 | 久久久国产一区二区三区 | 国产激情精品一区二区三区 | 人人爽人人爽人人片av亚洲 | 国产成人无码av在线影院 | 性欧美大战久久久久久久 | 国产激情无码一区二区app | 国产成人无码午夜视频在线观看 | 色偷偷人人澡人人爽人人模 | 中文字幕人妻无码一区二区三区 | 久久亚洲国产成人精品性色 | 性啪啪chinese东北女人 | 国产精品久久久久久久影院 | 成年美女黄网站色大免费视频 | 2019午夜福利不卡片在线 | 天海翼激烈高潮到腰振不止 | 无码中文字幕色专区 | 国产成人精品久久亚洲高清不卡 | 午夜精品久久久久久久 | 免费人成在线视频无码 | 老熟女乱子伦 | 日日摸夜夜摸狠狠摸婷婷 | 中文字幕人妻丝袜二区 | 亚洲 日韩 欧美 成人 在线观看 | 国产人妻精品午夜福利免费 | 日韩av无码中文无码电影 | 国产成人无码av在线影院 | 精品国产av色一区二区深夜久久 | 樱花草在线播放免费中文 | 国产精品嫩草久久久久 | 一本久道久久综合狠狠爱 | 少妇人妻大乳在线视频 | 精品无码一区二区三区的天堂 | 初尝人妻少妇中文字幕 | 国产麻豆精品精东影业av网站 | 中文字幕无码视频专区 | 男人和女人高潮免费网站 | 熟妇人妻无乱码中文字幕 | 粗大的内捧猛烈进出视频 | 无套内谢的新婚少妇国语播放 | 国产成人亚洲综合无码 | 一二三四社区在线中文视频 | 亚洲成av人综合在线观看 | 乱人伦人妻中文字幕无码 | 精品国产福利一区二区 | 亚洲国产精品无码久久久久高潮 | 国产免费观看黄av片 | 无码人妻精品一区二区三区下载 | 亚洲国产精华液网站w | 欧美日韩综合一区二区三区 | 久久久久se色偷偷亚洲精品av | 中文无码成人免费视频在线观看 | 精品无码国产自产拍在线观看蜜 | 欧美激情一区二区三区成人 | 精品成人av一区二区三区 | 一本久久伊人热热精品中文字幕 | 狠狠噜狠狠狠狠丁香五月 | 国产又粗又硬又大爽黄老大爷视 | 欧美精品无码一区二区三区 | av人摸人人人澡人人超碰下载 | 亚洲欧美国产精品久久 | 四十如虎的丰满熟妇啪啪 | 在教室伦流澡到高潮hnp视频 | 日日碰狠狠丁香久燥 | av人摸人人人澡人人超碰下载 | 国产极品美女高潮无套在线观看 | 久久久久久a亚洲欧洲av冫 | 欧美日韩一区二区三区自拍 | 国产三级精品三级男人的天堂 | 图片小说视频一区二区 | 精品国产一区二区三区四区 | 国产精品无码成人午夜电影 | 97久久精品无码一区二区 | 男人的天堂av网站 | 日本一本二本三区免费 | 日日躁夜夜躁狠狠躁 | 在线亚洲高清揄拍自拍一品区 | 一本一道久久综合久久 | 国产97人人超碰caoprom | 欧美成人午夜精品久久久 | 性色欲情网站iwww九文堂 | 久久综合香蕉国产蜜臀av | 激情亚洲一区国产精品 | 日韩精品a片一区二区三区妖精 | 美女毛片一区二区三区四区 | 中文字幕乱码人妻二区三区 | 天天爽夜夜爽夜夜爽 | 国产成人综合美国十次 | 中国女人内谢69xxxxxa片 | 亚洲日本va午夜在线电影 | 亚洲国产精品久久久久久 | 丰满岳乱妇在线观看中字无码 | 大肉大捧一进一出视频出来呀 | 国产卡一卡二卡三 | 久久久中文久久久无码 | 狂野欧美激情性xxxx | 18黄暴禁片在线观看 | 国产精品对白交换视频 | 精品人妻av区 | 久9re热视频这里只有精品 | 大胆欧美熟妇xx | 99视频精品全部免费免费观看 | 一本久道久久综合狠狠爱 | 狠狠躁日日躁夜夜躁2020 | 久久99精品久久久久婷婷 | 国产精品香蕉在线观看 | 欧美精品免费观看二区 | 日日橹狠狠爱欧美视频 | 精品无人区无码乱码毛片国产 | 国产高潮视频在线观看 | 精品偷拍一区二区三区在线看 | 亚洲中文字幕无码中文字在线 | 亚洲色欲色欲欲www在线 | 久久精品中文闷骚内射 | 又大又黄又粗又爽的免费视频 | 日本精品人妻无码77777 天堂一区人妻无码 | 强奷人妻日本中文字幕 | 偷窥日本少妇撒尿chinese | 国产三级精品三级男人的天堂 | 桃花色综合影院 | 久久久国产一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲欧洲日本综合aⅴ在线 | 狠狠亚洲超碰狼人久久 | 99er热精品视频 | 久久熟妇人妻午夜寂寞影院 | 国产午夜无码精品免费看 | 人人妻人人澡人人爽人人精品浪潮 | 欧美日韩人成综合在线播放 | 亚洲色成人中文字幕网站 | 国语精品一区二区三区 | 久久精品一区二区三区四区 | 又大又黄又粗又爽的免费视频 | 国产亚洲精品精品国产亚洲综合 | 天堂在线观看www | 色婷婷久久一区二区三区麻豆 | 国产一区二区三区影院 | 久久亚洲国产成人精品性色 | 国产激情无码一区二区app | 亚洲小说春色综合另类 | 377p欧洲日本亚洲大胆 | 亚洲理论电影在线观看 | 色五月五月丁香亚洲综合网 | 国产av一区二区精品久久凹凸 | 又大又硬又爽免费视频 | 99久久人妻精品免费一区 | 亚洲精品中文字幕乱码 | 亚洲国产精品成人久久蜜臀 | 正在播放东北夫妻内射 | 精品无码一区二区三区的天堂 | 97无码免费人妻超级碰碰夜夜 | 久久精品国产大片免费观看 | 国产精品爱久久久久久久 | 精品午夜福利在线观看 | 成年女人永久免费看片 | 3d动漫精品啪啪一区二区中 | 亚洲综合色区中文字幕 | 欧美成人家庭影院 | 窝窝午夜理论片影院 | 麻豆蜜桃av蜜臀av色欲av | 国产精品对白交换视频 | 色综合久久久无码网中文 | 亚洲最大成人网站 | 又色又爽又黄的美女裸体网站 | 性欧美牲交xxxxx视频 | 久久人妻内射无码一区三区 | 最近免费中文字幕中文高清百度 | 中文精品无码中文字幕无码专区 | 欧美激情一区二区三区成人 | 又湿又紧又大又爽a视频国产 | 四虎永久在线精品免费网址 | 熟妇女人妻丰满少妇中文字幕 | 国产香蕉尹人视频在线 | 国产 精品 自在自线 | 亚洲娇小与黑人巨大交 | 国产疯狂伦交大片 | 午夜免费福利小电影 | 97久久国产亚洲精品超碰热 | 亚洲欧美色中文字幕在线 | 西西人体www44rt大胆高清 | 双乳奶水饱满少妇呻吟 | 久久aⅴ免费观看 | 亚洲中文字幕va福利 | 在线观看国产午夜福利片 | 无遮挡国产高潮视频免费观看 | 免费观看激色视频网站 | 网友自拍区视频精品 | 在线а√天堂中文官网 | 色综合久久网 | 亚洲一区二区三区播放 | 亚洲精品一区二区三区婷婷月 | 国产偷国产偷精品高清尤物 | 午夜成人1000部免费视频 | 国产又粗又硬又大爽黄老大爷视 | 牛和人交xxxx欧美 | 国内少妇偷人精品视频免费 | 国产精品久久久久久亚洲毛片 | 亚洲人亚洲人成电影网站色 | 久久久久人妻一区精品色欧美 | 无码精品人妻一区二区三区av | 精品无码国产一区二区三区av | 国产激情一区二区三区 | 婷婷综合久久中文字幕蜜桃三电影 | 国产特级毛片aaaaaa高潮流水 | 99久久婷婷国产综合精品青草免费 | 亚洲人成影院在线无码按摩店 | 欧美成人家庭影院 | 西西人体www44rt大胆高清 | 日本熟妇人妻xxxxx人hd | 无码国产色欲xxxxx视频 | 欧美激情综合亚洲一二区 | 18禁止看的免费污网站 | 亚洲一区av无码专区在线观看 | 亚洲一区二区三区偷拍女厕 | 亚洲色偷偷偷综合网 | 国产极品美女高潮无套在线观看 | 国产免费无码一区二区视频 | 国产香蕉尹人视频在线 | 国产成人精品三级麻豆 | 无码av中文字幕免费放 | 亚洲精品一区二区三区在线 | 少妇无套内谢久久久久 | 欧美成人午夜精品久久久 | 无码人妻久久一区二区三区不卡 | 中文字幕乱码亚洲无线三区 | 国产精品视频免费播放 | 日本va欧美va欧美va精品 | 国产亚洲精品久久久久久久久动漫 | 亚洲国产精品一区二区美利坚 | 搡女人真爽免费视频大全 | 无码一区二区三区在线观看 | 免费观看又污又黄的网站 | 一个人免费观看的www视频 | 中文字幕亚洲情99在线 | 亚洲成在人网站无码天堂 | 乌克兰少妇xxxx做受 | 无套内射视频囯产 | 日本一卡二卡不卡视频查询 | 国产午夜无码精品免费看 | 小sao货水好多真紧h无码视频 | 精品无码国产一区二区三区av | 性史性农村dvd毛片 | 人人澡人人透人人爽 | 亚洲欧洲中文日韩av乱码 | 日本免费一区二区三区最新 | av小次郎收藏 | 少妇性l交大片 | 亚洲一区二区观看播放 | 国产精品永久免费视频 | 一区二区传媒有限公司 | 久久精品成人欧美大片 | 久久精品中文闷骚内射 | 久久熟妇人妻午夜寂寞影院 | 国精品人妻无码一区二区三区蜜柚 | 一本色道婷婷久久欧美 | 国产人妻精品一区二区三区不卡 | 国产内射爽爽大片视频社区在线 | 精品欧美一区二区三区久久久 | 特级做a爰片毛片免费69 | 亚洲成熟女人毛毛耸耸多 | 噜噜噜亚洲色成人网站 | 亚洲成av人综合在线观看 | 日日天干夜夜狠狠爱 | 国产熟女一区二区三区四区五区 | 免费乱码人妻系列无码专区 | 亚洲无人区午夜福利码高清完整版 | 色一情一乱一伦一区二区三欧美 | 四虎影视成人永久免费观看视频 | 人人妻人人澡人人爽欧美一区九九 | 桃花色综合影院 | 老司机亚洲精品影院 | 强奷人妻日本中文字幕 | 少妇久久久久久人妻无码 | 日本精品少妇一区二区三区 | 亚洲国产欧美国产综合一区 | 女人被男人爽到呻吟的视频 | 人人妻在人人 | 色欲人妻aaaaaaa无码 | 亚洲人成人无码网www国产 | 在线a亚洲视频播放在线观看 | 九一九色国产 | 欧洲极品少妇 | 欧美人与禽zoz0性伦交 | 欧美精品一区二区精品久久 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产综合久久久久鬼色 | 无码人妻精品一区二区三区不卡 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 超碰97人人做人人爱少妇 | 国产精品亚洲专区无码不卡 | 蜜桃av抽搐高潮一区二区 | 亚洲爆乳精品无码一区二区三区 | 国产无遮挡又黄又爽又色 | 久久久久久九九精品久 | 国产va免费精品观看 | 亚洲精品久久久久久一区二区 | 一本无码人妻在中文字幕免费 | 精品国产aⅴ无码一区二区 | 久久久久成人片免费观看蜜芽 | 国产片av国语在线观看 | 天海翼激烈高潮到腰振不止 | 欧美野外疯狂做受xxxx高潮 | 日韩人妻少妇一区二区三区 | 人人妻人人藻人人爽欧美一区 | 又紧又大又爽精品一区二区 | 国内综合精品午夜久久资源 | 色一情一乱一伦一视频免费看 | 图片小说视频一区二区 | 免费国产成人高清在线观看网站 | 无码成人精品区在线观看 | 无码人妻丰满熟妇区毛片18 | 久久久国产一区二区三区 | 免费人成网站视频在线观看 | 国産精品久久久久久久 | 欧美freesex黑人又粗又大 | 国产舌乚八伦偷品w中 | 熟女体下毛毛黑森林 | 日本一卡二卡不卡视频查询 | 国产亚洲精品久久久久久大师 | 无套内谢老熟女 | 亚洲爆乳大丰满无码专区 | 亚洲精品www久久久 | 久久无码人妻影院 | 久久国产精品二国产精品 | 久久99热只有频精品8 | 在线视频网站www色 | 亚洲人亚洲人成电影网站色 | 亚洲精品一区二区三区婷婷月 | 精品无码av一区二区三区 | 亚洲国产精品无码一区二区三区 | 国产人妻人伦精品 | 亚洲日本在线电影 | 欧美熟妇另类久久久久久多毛 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲の无码国产の无码影院 | 无码播放一区二区三区 | 国产精品香蕉在线观看 | 无码乱肉视频免费大全合集 | 国产福利视频一区二区 | 麻豆国产丝袜白领秘书在线观看 | 国产明星裸体无码xxxx视频 | 国产精品久久久一区二区三区 | 国产成人综合在线女婷五月99播放 | 欧美激情综合亚洲一二区 | 国产精品美女久久久网av | 色狠狠av一区二区三区 | 日韩亚洲欧美中文高清在线 | 亚洲自偷精品视频自拍 | 欧美freesex黑人又粗又大 | 超碰97人人做人人爱少妇 | 亚洲国产成人av在线观看 | 日本精品少妇一区二区三区 | 精品国产国产综合精品 | 日韩精品一区二区av在线 | 日本一卡二卡不卡视频查询 | 装睡被陌生人摸出水好爽 | 四十如虎的丰满熟妇啪啪 | 国产精品无码永久免费888 | 欧美35页视频在线观看 | 一本加勒比波多野结衣 | 狂野欧美性猛xxxx乱大交 | 国语自产偷拍精品视频偷 | 在线成人www免费观看视频 | 少妇一晚三次一区二区三区 | 国模大胆一区二区三区 | 亚洲 另类 在线 欧美 制服 | 中文无码伦av中文字幕 | 亚洲 欧美 激情 小说 另类 | 亚洲娇小与黑人巨大交 | 亚洲精品一区国产 | 九九久久精品国产免费看小说 | 亚洲成av人在线观看网址 | 男人的天堂2018无码 | 思思久久99热只有频精品66 | 在线成人www免费观看视频 | 国产亚洲精品久久久久久 | 亚洲国产欧美在线成人 | 高清不卡一区二区三区 | 牲交欧美兽交欧美 | 亚洲成a人片在线观看无码3d | 亚洲国产精品成人久久蜜臀 | 亚洲欧美中文字幕5发布 | 日本护士毛茸茸高潮 | 欧美日韩综合一区二区三区 | 欧美老妇交乱视频在线观看 | 久久99精品久久久久婷婷 | 国产精品高潮呻吟av久久4虎 | 乱人伦人妻中文字幕无码 | 丰满诱人的人妻3 | 午夜精品一区二区三区在线观看 | 99久久久无码国产精品免费 | 日本www一道久久久免费榴莲 | 亚洲精品无码国产 | 国产人妻人伦精品1国产丝袜 | 亚洲精品综合一区二区三区在线 | 国产精品自产拍在线观看 | 久久久久99精品成人片 | 欧美性黑人极品hd | 亚洲中文字幕乱码av波多ji | 国产一精品一av一免费 | 未满小14洗澡无码视频网站 | 女高中生第一次破苞av | 人人妻人人澡人人爽欧美一区 | 亚洲七七久久桃花影院 | 亚洲人成影院在线观看 | 亚洲日韩一区二区三区 | 中国女人内谢69xxxxxa片 | 亚洲国产av精品一区二区蜜芽 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲男人av天堂午夜在 | 97色伦图片97综合影院 | 国产成人午夜福利在线播放 | 成人欧美一区二区三区黑人免费 | 美女极度色诱视频国产 | 精品国偷自产在线视频 | 国产亚洲视频中文字幕97精品 | 国产网红无码精品视频 | 漂亮人妻洗澡被公强 日日躁 | 中文字幕av日韩精品一区二区 | 奇米影视7777久久精品人人爽 | 麻豆蜜桃av蜜臀av色欲av | 九九在线中文字幕无码 | 青春草在线视频免费观看 | 国精品人妻无码一区二区三区蜜柚 | 国产性生大片免费观看性 | 国产深夜福利视频在线 | 中文精品无码中文字幕无码专区 | 精品久久久久香蕉网 | 蜜桃视频插满18在线观看 | 国产乡下妇女做爰 | 亚洲精品www久久久 | 国产激情艳情在线看视频 | 亚洲精品国产品国语在线观看 | 亚洲综合在线一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 亚洲最大成人网站 | 成人影院yy111111在线观看 | 波多野结衣乳巨码无在线观看 | 亚洲欧美色中文字幕在线 | 中文精品久久久久人妻不卡 | 国产亚洲精品久久久久久久久动漫 | 日韩亚洲欧美精品综合 | 在线 国产 欧美 亚洲 天堂 | 国产精品久久福利网站 | 国产区女主播在线观看 | 久久五月精品中文字幕 | 亚洲国产av精品一区二区蜜芽 | 亚洲精品中文字幕乱码 | 国产99久久精品一区二区 | 久久综合网欧美色妞网 | 无码免费一区二区三区 | 无遮挡啪啪摇乳动态图 | 亚洲日韩av一区二区三区中文 | 国产人妻精品午夜福利免费 | 老太婆性杂交欧美肥老太 | 99re在线播放 | 亚洲国产精品成人久久蜜臀 | 99riav国产精品视频 | 国产成人无码av在线影院 | 国产精品久久久久影院嫩草 | 欧美日韩精品 | 久久国产精品萌白酱免费 | 九九久久精品国产免费看小说 | 欧美猛少妇色xxxxx | 亚洲精品国产品国语在线观看 | 国产av人人夜夜澡人人爽麻豆 | 亚洲成熟女人毛毛耸耸多 | 漂亮人妻洗澡被公强 日日躁 | 亚洲中文字幕成人无码 | 亚洲乱码日产精品bd | 青青草原综合久久大伊人精品 | 亚洲人成网站色7799 | 无码国内精品人妻少妇 | 乱人伦人妻中文字幕无码 | 国产精品99久久精品爆乳 | 精品一区二区三区无码免费视频 | 国产精华av午夜在线观看 | 亚洲呦女专区 | 99久久精品日本一区二区免费 | 永久免费观看美女裸体的网站 | 国产精品无码永久免费888 | 久久久www成人免费毛片 | 野狼第一精品社区 | 扒开双腿疯狂进出爽爽爽视频 | 久久久中文字幕日本无吗 | 俺去俺来也在线www色官网 | 永久免费观看美女裸体的网站 | 狠狠综合久久久久综合网 | 日韩亚洲欧美精品综合 | 亚洲中文字幕av在天堂 | 国产办公室秘书无码精品99 | 中文字幕精品av一区二区五区 | ass日本丰满熟妇pics | 中国大陆精品视频xxxx | 亚洲性无码av中文字幕 | 国产综合色产在线精品 | 人妻互换免费中文字幕 | 亚洲乱码日产精品bd | 小sao货水好多真紧h无码视频 | 99久久精品国产一区二区蜜芽 | 国产激情综合五月久久 | 无码午夜成人1000部免费视频 | 久久久国产精品无码免费专区 | 亚洲人成网站免费播放 | a国产一区二区免费入口 | www国产亚洲精品久久久日本 | 免费无码肉片在线观看 | 亚洲小说图区综合在线 | 欧美性猛交xxxx富婆 | 亚洲精品午夜无码电影网 | 国产性生大片免费观看性 | www成人国产高清内射 | 久久国产自偷自偷免费一区调 | 波多野42部无码喷潮在线 | 成人性做爰aaa片免费看 | 日本熟妇大屁股人妻 | 久久精品无码一区二区三区 | а√资源新版在线天堂 | 国产成人午夜福利在线播放 | 欧美熟妇另类久久久久久不卡 | 国产精品免费大片 | 国产 浪潮av性色四虎 | 成人欧美一区二区三区 | 美女毛片一区二区三区四区 | 日本大乳高潮视频在线观看 | 丰满少妇人妻久久久久久 | 亚洲另类伦春色综合小说 | 国产乱子伦视频在线播放 | 乱人伦人妻中文字幕无码 | 久久综合色之久久综合 | 国产热a欧美热a在线视频 | 日产国产精品亚洲系列 | 四虎影视成人永久免费观看视频 | 日本熟妇浓毛 | 国产精品久久久久久亚洲影视内衣 | 精品久久久无码中文字幕 | 99久久人妻精品免费二区 | 少妇人妻av毛片在线看 | 一本久道高清无码视频 | 伊人久久大香线蕉av一区二区 | 国产成人精品无码播放 | 亚洲爆乳精品无码一区二区三区 | 清纯唯美经典一区二区 | 男女超爽视频免费播放 | 人妻互换免费中文字幕 | 亚洲 日韩 欧美 成人 在线观看 | 131美女爱做视频 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲 欧美 激情 小说 另类 | 巨爆乳无码视频在线观看 | 亚无码乱人伦一区二区 | 国产乱人伦偷精品视频 | 在线 国产 欧美 亚洲 天堂 | 免费人成在线视频无码 | 最新国产乱人伦偷精品免费网站 | 性生交大片免费看女人按摩摩 | 国产偷自视频区视频 | 狠狠躁日日躁夜夜躁2020 | 久久久久国色av免费观看性色 | 六十路熟妇乱子伦 | 亚洲人成网站在线播放942 | 欧美 亚洲 国产 另类 | 麻豆精品国产精华精华液好用吗 | 东京热一精品无码av | 国产xxx69麻豆国语对白 | 女人被男人躁得好爽免费视频 | 亚洲中文无码av永久不收费 | 国产成人精品一区二区在线小狼 | 99麻豆久久久国产精品免费 | 欧美激情内射喷水高潮 | 美女黄网站人色视频免费国产 | 强伦人妻一区二区三区视频18 | 中文字幕色婷婷在线视频 | 亚洲人成无码网www | 亚洲国产精品久久久天堂 | 日本www一道久久久免费榴莲 | 久热国产vs视频在线观看 | 国产人妖乱国产精品人妖 | 成人无码影片精品久久久 | 亚洲国产精品美女久久久久 | 红桃av一区二区三区在线无码av | 欧美人与禽zoz0性伦交 | 国产av人人夜夜澡人人爽麻豆 | 亚洲国产精品成人久久蜜臀 | 无码人妻精品一区二区三区不卡 | 色婷婷欧美在线播放内射 | 欧洲熟妇色 欧美 | 夜精品a片一区二区三区无码白浆 | 乱人伦人妻中文字幕无码久久网 | 初尝人妻少妇中文字幕 | 日日摸夜夜摸狠狠摸婷婷 | 青春草在线视频免费观看 | 国产片av国语在线观看 | 99精品视频在线观看免费 | 国产精品99爱免费视频 | 国内精品人妻无码久久久影院 | 国产精品手机免费 | 国产精品人人爽人人做我的可爱 | 小泽玛莉亚一区二区视频在线 | 亚洲天堂2017无码中文 | 欧美乱妇无乱码大黄a片 | 国产欧美精品一区二区三区 | 精品国产一区av天美传媒 | 欧美日韩综合一区二区三区 | 日本一区二区三区免费播放 | 熟妇人妻无码xxx视频 | 午夜无码区在线观看 | 亚洲精品美女久久久久久久 | 日本大香伊一区二区三区 | 欧美日韩视频无码一区二区三 | 亚洲自偷自拍另类第1页 | 熟妇人妻无乱码中文字幕 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 精品无码成人片一区二区98 | 精品欧美一区二区三区久久久 | 永久免费观看美女裸体的网站 | 欧美性生交xxxxx久久久 | 小泽玛莉亚一区二区视频在线 | 乱人伦人妻中文字幕无码 | 国产电影无码午夜在线播放 | 中文字幕无码人妻少妇免费 | 午夜理论片yy44880影院 | 欧洲熟妇色 欧美 | 精品一区二区三区波多野结衣 | 国产两女互慰高潮视频在线观看 | 中文字幕无码免费久久99 | 伊人久久大香线蕉亚洲 | 99久久99久久免费精品蜜桃 | 免费无码肉片在线观看 | v一区无码内射国产 | 一本无码人妻在中文字幕免费 | 欧洲欧美人成视频在线 | 波多野结衣av在线观看 | 亚洲日韩av一区二区三区四区 | 亚洲色欲色欲欲www在线 | 67194成是人免费无码 | 国产精品二区一区二区aⅴ污介绍 | 国产性生交xxxxx无码 | 亚洲一区二区三区偷拍女厕 | 熟妇人妻无乱码中文字幕 | 欧美自拍另类欧美综合图片区 | 少妇人妻大乳在线视频 | 国产成人精品一区二区在线小狼 | 精品人妻人人做人人爽夜夜爽 | 国产成人综合色在线观看网站 | 99麻豆久久久国产精品免费 | 国产又爽又黄又刺激的视频 | 国内精品久久毛片一区二区 | 国产激情无码一区二区app | 久久精品国产大片免费观看 | 欧美熟妇另类久久久久久多毛 | 国产无遮挡又黄又爽免费视频 | 又湿又紧又大又爽a视频国产 | 日本在线高清不卡免费播放 | 国产黑色丝袜在线播放 | 无码人妻久久一区二区三区不卡 | 麻豆成人精品国产免费 | 狠狠躁日日躁夜夜躁2020 | 伊人久久大香线蕉午夜 | 又色又爽又黄的美女裸体网站 | 女人被男人躁得好爽免费视频 | 无码乱肉视频免费大全合集 | 乱人伦人妻中文字幕无码久久网 | 色妞www精品免费视频 | 日本一卡2卡3卡四卡精品网站 | 无码吃奶揉捏奶头高潮视频 | 国产精品久久久久久无码 | 少妇一晚三次一区二区三区 | 女人被男人躁得好爽免费视频 | 久久午夜无码鲁丝片午夜精品 | 久9re热视频这里只有精品 | 中文字幕无码视频专区 | 香港三级日本三级妇三级 | 无码人妻精品一区二区三区下载 | 天天拍夜夜添久久精品 | 国产成人综合色在线观看网站 | 国产香蕉97碰碰久久人人 | 精品偷拍一区二区三区在线看 | 久久精品中文字幕一区 | 精品成人av一区二区三区 | 国产亚洲精品久久久久久久 | 少妇厨房愉情理9仑片视频 | 中文字幕 人妻熟女 | 欧美xxxxx精品 | 日韩av无码中文无码电影 | 久久zyz资源站无码中文动漫 | 免费观看黄网站 | 国产办公室秘书无码精品99 | 人人妻人人澡人人爽精品欧美 | 亚洲精品一区二区三区在线 | 97色伦图片97综合影院 | 宝宝好涨水快流出来免费视频 | 扒开双腿吃奶呻吟做受视频 | 无套内射视频囯产 | 99视频精品全部免费免费观看 | 人妻夜夜爽天天爽三区 | 亚洲午夜久久久影院 | 人妻与老人中文字幕 | 人妻少妇精品久久 | 性生交大片免费看l | 国产美女精品一区二区三区 | 日韩人妻系列无码专区 | 精品久久久久久人妻无码中文字幕 | 亚洲无人区午夜福利码高清完整版 | 精品国偷自产在线 | 亚洲毛片av日韩av无码 | 伊人久久大香线蕉av一区二区 | 亚洲日本va午夜在线电影 | 国产成人精品三级麻豆 | 大胆欧美熟妇xx | 精品水蜜桃久久久久久久 | 永久免费观看美女裸体的网站 | 亚洲日韩乱码中文无码蜜桃臀网站 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲欧洲无卡二区视頻 | 精品一二三区久久aaa片 | 免费国产黄网站在线观看 | 四虎影视成人永久免费观看视频 | 久久精品中文字幕一区 | 国产三级精品三级男人的天堂 | 中文字幕无码视频专区 | 无码成人精品区在线观看 | 免费国产成人高清在线观看网站 | 天干天干啦夜天干天2017 | 日韩精品一区二区av在线 | 欧美猛少妇色xxxxx | 在线观看国产午夜福利片 | 中文字幕色婷婷在线视频 | 中文无码成人免费视频在线观看 | 中文字幕人妻无码一夲道 | 无码人妻av免费一区二区三区 | 欧美老人巨大xxxx做受 | 少妇性俱乐部纵欲狂欢电影 | 日韩av无码中文无码电影 | a在线亚洲男人的天堂 | 中文毛片无遮挡高清免费 | 国产人妻人伦精品 | 伊人久久婷婷五月综合97色 | 久久久精品欧美一区二区免费 | 日韩少妇白浆无码系列 | 亚洲国产精品美女久久久久 | 亚拍精品一区二区三区探花 | 成人欧美一区二区三区黑人 | 精品国偷自产在线 | 久久精品人人做人人综合 | 老子影院午夜伦不卡 | 99在线 | 亚洲 | 亚洲第一网站男人都懂 | 亚洲欧美中文字幕5发布 | 成人无码精品1区2区3区免费看 | 精品国产一区二区三区av 性色 | 久久综合香蕉国产蜜臀av | 欧美丰满少妇xxxx性 | 国产成人精品优优av | 国产激情艳情在线看视频 | 沈阳熟女露脸对白视频 | 亚洲国产精品无码久久久久高潮 | 在线精品国产一区二区三区 | 国产又爽又黄又刺激的视频 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产精品亚洲五月天高清 | 亚洲综合色区中文字幕 | 亚洲一区二区三区含羞草 | 国产精品久久久久影院嫩草 | 国产内射爽爽大片视频社区在线 | 中文精品无码中文字幕无码专区 | 亚洲日韩中文字幕在线播放 | 鲁大师影院在线观看 | 国产无遮挡又黄又爽免费视频 | 中文字幕人成乱码熟女app | 亚洲日韩乱码中文无码蜜桃臀网站 | 日韩精品a片一区二区三区妖精 | 亚洲精品国偷拍自产在线观看蜜桃 | 在线观看国产一区二区三区 | 亚洲中文字幕在线无码一区二区 | 精品久久8x国产免费观看 | 国产午夜亚洲精品不卡 | 久久精品一区二区三区四区 | 国产精品理论片在线观看 | 亚洲综合久久一区二区 | 亚洲の无码国产の无码步美 | 人妻有码中文字幕在线 | 亚洲日韩乱码中文无码蜜桃臀网站 | 强辱丰满人妻hd中文字幕 | 午夜时刻免费入口 | 日韩少妇白浆无码系列 | 亚洲中文字幕在线无码一区二区 | 久久无码中文字幕免费影院蜜桃 | 一本久久伊人热热精品中文字幕 | 少妇被粗大的猛进出69影院 | 给我免费的视频在线观看 | 小鲜肉自慰网站xnxx | 国产午夜福利100集发布 | 亚洲综合久久一区二区 | 欧美人与善在线com | 成人免费无码大片a毛片 | 日产精品高潮呻吟av久久 | 中国大陆精品视频xxxx | 亚洲区小说区激情区图片区 | 国产激情一区二区三区 | 国产亚洲精品久久久久久大师 | 久久综合网欧美色妞网 | 日韩av无码一区二区三区不卡 | 一本久久a久久精品亚洲 | 日本熟妇乱子伦xxxx | 国产精品亚洲五月天高清 | 99riav国产精品视频 | 兔费看少妇性l交大片免费 | 婷婷五月综合缴情在线视频 | 兔费看少妇性l交大片免费 | 色窝窝无码一区二区三区色欲 | 欧美丰满熟妇xxxx | 久久久久成人精品免费播放动漫 | 内射老妇bbwx0c0ck | 亚洲男女内射在线播放 | 欧洲精品码一区二区三区免费看 | 欧美人与禽猛交狂配 | 欧美性生交xxxxx久久久 | 精品久久久中文字幕人妻 | 澳门永久av免费网站 | 欧美日韩一区二区免费视频 | 精品国偷自产在线视频 | 欧美野外疯狂做受xxxx高潮 | 青青草原综合久久大伊人精品 | 国产美女精品一区二区三区 | 国产日产欧产精品精品app | 爱做久久久久久 | 精品一区二区三区无码免费视频 | 中国女人内谢69xxxx | 天天躁日日躁狠狠躁免费麻豆 | 亚洲乱亚洲乱妇50p | 无码国产乱人伦偷精品视频 | 狂野欧美性猛交免费视频 | 久久精品国产亚洲精品 | 国产精品亚洲专区无码不卡 | 国产三级久久久精品麻豆三级 | 国产精品久久久久9999小说 | 少妇性l交大片欧洲热妇乱xxx | 国产精品99久久精品爆乳 | 日本肉体xxxx裸交 | 老熟女重囗味hdxx69 | 67194成是人免费无码 | 天下第一社区视频www日本 | 久久久国产一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 天天做天天爱天天爽综合网 | 天天躁夜夜躁狠狠是什么心态 | 亚洲精品国产第一综合99久久 | 人妻无码久久精品人妻 | 鲁大师影院在线观看 | 天天躁夜夜躁狠狠是什么心态 | 亚洲日韩av一区二区三区中文 | 中文字幕无码视频专区 | 久久久精品欧美一区二区免费 | 亚洲毛片av日韩av无码 | 国产精品国产三级国产专播 | 女人被男人爽到呻吟的视频 | 久久综合久久自在自线精品自 | 欧美亚洲日韩国产人成在线播放 | 久久综合色之久久综合 | 无码国产激情在线观看 | 激情内射日本一区二区三区 | 最新国产麻豆aⅴ精品无码 | 久久精品中文字幕一区 | 国产艳妇av在线观看果冻传媒 | 国产精品办公室沙发 | 欧美 亚洲 国产 另类 | 国产成人亚洲综合无码 | 国产精品久久久午夜夜伦鲁鲁 | 九月婷婷人人澡人人添人人爽 | 无码人妻丰满熟妇区五十路百度 | 欧美性黑人极品hd | 女人被爽到呻吟gif动态图视看 | 又大又紧又粉嫩18p少妇 | 亚洲aⅴ无码成人网站国产app | 亚洲精品成a人在线观看 | 狠狠噜狠狠狠狠丁香五月 | 日本在线高清不卡免费播放 | 人妻无码久久精品人妻 | 成熟妇人a片免费看网站 | 国产99久久精品一区二区 | 日本大乳高潮视频在线观看 | 国产成人精品必看 | 国产极品视觉盛宴 | 国产精品无码mv在线观看 | 99国产精品白浆在线观看免费 | 色情久久久av熟女人妻网站 | 国产成人无码av一区二区 | 成人精品视频一区二区三区尤物 | 无码国产乱人伦偷精品视频 | 免费看少妇作爱视频 | 少妇太爽了在线观看 | 夫妻免费无码v看片 | 粉嫩少妇内射浓精videos | 天堂无码人妻精品一区二区三区 | 日韩亚洲欧美精品综合 | 久久亚洲精品中文字幕无男同 | 国产无套粉嫩白浆在线 | 欧洲精品码一区二区三区免费看 | 中文字幕无码日韩专区 | 人人妻人人澡人人爽精品欧美 | 动漫av网站免费观看 | 国产成人无码区免费内射一片色欲 | 男女爱爱好爽视频免费看 | 亚洲乱码日产精品bd | 中文字幕+乱码+中文字幕一区 | 国产精品无码mv在线观看 | 色婷婷欧美在线播放内射 | 国产在热线精品视频 | 成年美女黄网站色大免费视频 | 性生交片免费无码看人 | 国产香蕉尹人综合在线观看 | 国产肉丝袜在线观看 | 天堂а√在线地址中文在线 | √8天堂资源地址中文在线 | 无码人妻精品一区二区三区下载 | 国产精品久久久av久久久 | 精品无码av一区二区三区 | 丰满岳乱妇在线观看中字无码 | 中文字幕无码av激情不卡 | 久久久久久九九精品久 | 国产激情无码一区二区 | 中文字幕无码乱人伦 | 色五月丁香五月综合五月 | 天天爽夜夜爽夜夜爽 | 乱码午夜-极国产极内射 | 无码国内精品人妻少妇 | 精品国产成人一区二区三区 | 在线精品国产一区二区三区 | 露脸叫床粗话东北少妇 | 撕开奶罩揉吮奶头视频 | 精品偷拍一区二区三区在线看 | 精品午夜福利在线观看 | 色婷婷综合中文久久一本 | 青草青草久热国产精品 | 波多野42部无码喷潮在线 | 免费无码的av片在线观看 | 色情久久久av熟女人妻网站 | 中文无码精品a∨在线观看不卡 | 久久久国产一区二区三区 | 国产舌乚八伦偷品w中 | 成人无码精品1区2区3区免费看 | 国产精品久久久久7777 | 亚洲人交乣女bbw | 少妇厨房愉情理9仑片视频 | 男人的天堂2018无码 | 四虎永久在线精品免费网址 | 一本大道久久东京热无码av | 岛国片人妻三上悠亚 | 宝宝好涨水快流出来免费视频 | 亚洲毛片av日韩av无码 | 精品少妇爆乳无码av无码专区 | 无码人妻久久一区二区三区不卡 | 国产色在线 | 国产 | 妺妺窝人体色www婷婷 | 免费人成在线观看网站 | 少妇激情av一区二区 | 国产精品美女久久久 | 秋霞特色aa大片 | 一本久久a久久精品vr综合 | 日韩成人一区二区三区在线观看 | 亚洲综合在线一区二区三区 | 亚洲欧美国产精品久久 | 欧美 亚洲 国产 另类 | 精品久久久久久亚洲精品 | 久久久精品成人免费观看 | 东京一本一道一二三区 | 亚洲爆乳精品无码一区二区三区 | 国产成人无码av片在线观看不卡 | 狠狠躁日日躁夜夜躁2020 | 日本丰满熟妇videos | 亚洲a无码综合a国产av中文 | 偷窥日本少妇撒尿chinese | 国产片av国语在线观看 | 牲欲强的熟妇农村老妇女 | 久久国语露脸国产精品电影 | 曰本女人与公拘交酡免费视频 | 日韩亚洲欧美中文高清在线 | 97夜夜澡人人爽人人喊中国片 | 亚洲va欧美va天堂v国产综合 | 午夜福利不卡在线视频 | 人人妻人人澡人人爽欧美一区九九 | 国产精品久久国产三级国 | 国产亚洲美女精品久久久2020 | 亚洲区小说区激情区图片区 | 在线成人www免费观看视频 | 一本色道久久综合亚洲精品不卡 | 老太婆性杂交欧美肥老太 | 国产精品久久久久7777 | 老熟女乱子伦 | 国产香蕉尹人综合在线观看 | 免费看男女做好爽好硬视频 | 亚洲 a v无 码免 费 成 人 a v | 在线а√天堂中文官网 | 99精品国产综合久久久久五月天 | 人人妻人人澡人人爽精品欧美 | 亚洲乱码国产乱码精品精 | 国产精品亚洲专区无码不卡 | 成人免费视频在线观看 | 中文字幕无码av波多野吉衣 | 久久精品国产一区二区三区 | 天堂在线观看www | 亚洲中文字幕乱码av波多ji | 任你躁在线精品免费 | 红桃av一区二区三区在线无码av | 中文字幕无码免费久久9一区9 | 成熟女人特级毛片www免费 | 中文字幕 亚洲精品 第1页 | 久久综合网欧美色妞网 | 亚洲精品久久久久久一区二区 | 东京一本一道一二三区 | 亚洲精品成人福利网站 | 亚洲精品国产第一综合99久久 | 天天拍夜夜添久久精品 | 四虎国产精品一区二区 | 国产超级va在线观看视频 | 麻豆精品国产精华精华液好用吗 | 成 人影片 免费观看 | 免费无码午夜福利片69 | 亚拍精品一区二区三区探花 | 中文字幕av日韩精品一区二区 | 无码成人精品区在线观看 | 国产亚洲人成在线播放 | 国产精品久久久久久亚洲影视内衣 | 伊人色综合久久天天小片 | 成人无码视频在线观看网站 | 成人无码精品一区二区三区 | 人人妻在人人 | 欧美真人作爱免费视频 | 亚洲人成人无码网www国产 | www一区二区www免费 | 国产麻豆精品精东影业av网站 | 国产精品国产三级国产专播 | 欧美丰满熟妇xxxx性ppx人交 | 麻豆人妻少妇精品无码专区 | 人人爽人人爽人人片av亚洲 | 精品成在人线av无码免费看 | 精品久久久久久人妻无码中文字幕 | 免费无码av一区二区 | 亚洲精品午夜无码电影网 | 精品人妻av区 | 给我免费的视频在线观看 | 久久综合狠狠综合久久综合88 | 中文字幕无码人妻少妇免费 | 亚洲成av人片天堂网无码】 | 久久精品国产一区二区三区肥胖 | 18黄暴禁片在线观看 | 国产人妻大战黑人第1集 | 亚洲码国产精品高潮在线 | 久青草影院在线观看国产 | 野狼第一精品社区 | 国产精品久久久久久亚洲影视内衣 | 国产精品手机免费 | 一区二区三区高清视频一 | 免费播放一区二区三区 | 久久久久久av无码免费看大片 | 日日麻批免费40分钟无码 | 无码av中文字幕免费放 | 日韩成人一区二区三区在线观看 | 日韩人妻无码一区二区三区久久99 | 欧美老妇与禽交 | 夫妻免费无码v看片 | 久久人人爽人人爽人人片ⅴ | 日韩精品无码一区二区中文字幕 | 色欲久久久天天天综合网精品 | 久久99国产综合精品 | 国产成人精品三级麻豆 | 好男人社区资源 | 国産精品久久久久久久 | 国内精品久久毛片一区二区 | 国产一精品一av一免费 | 国产亚洲精品久久久久久久 | 成人精品视频一区二区三区尤物 | 国产午夜精品一区二区三区嫩草 | 国产成人一区二区三区别 | 亚洲欧美日韩综合久久久 | 国产精品久久久久影院嫩草 | 亚洲人成无码网www | 精品日本一区二区三区在线观看 | 国产精品第一区揄拍无码 | 中文字幕无码热在线视频 | 欧美 日韩 亚洲 在线 | 老子影院午夜精品无码 | 久久人人97超碰a片精品 | 国产手机在线αⅴ片无码观看 | 无码帝国www无码专区色综合 | 欧美老妇交乱视频在线观看 | 四十如虎的丰满熟妇啪啪 | 亚洲男女内射在线播放 | 午夜肉伦伦影院 | 午夜成人1000部免费视频 |