国产精品青草久-国产精品情侣愉拍-国产精品区网红主-国产精品区一区二-国产精品热久久-国产精品热热热-国产精品人aⅴ-国产精品人成在线-国产精品人妻人伦-国产精品人人

金喜正规买球

為 ASP.NET 控件添加設計時支持

翻譯|其它|編輯:郝浩|2004-01-12 21:27:00.000|閱讀 1175 次

概述:

# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>

適用于:
     Microsoft® ASP.NET
     Microsoft Visual Studio® .NET
     Microsoft .NET Framework

摘要:學習如何構建利用 Microsoft Visual Studio .NET 設計時支持的控件,這種支持使控件能夠像 Microsoft ASP.NET 中的內置控件一樣易于使用。

下載 DesignTimeSupportSample.msi。(請注意,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者理解。)

本文是由《ASP.NET in a Nutshell》第二版(ISBN:0596001169)改編而成,其作者包括 G. Andrew Duthie 和 Matthew MacDonald,由 O'Reilly & Associates, Inc. 于 2003 年出版。

目錄

簡介
設計時支持的類型
Blog 控件示例
添加設計時支持
小結
代碼列表

簡介

Microsoft® ASP.NET 為開發人員提供了一種適用于 Web 開發的、功能最為強大的新工具:服務器控件。服務器控件使開發人員能夠在短時間內開發出響應速度快而且功能強大的 Web 應用程序,所需的時間與在典型的 ASP 中創建類似應用程序的時間差不多。

ASP.NET 服務器控件之所以能夠提供生產效率,關鍵原因之一在于它為 Microsoft Visual Studio® .NET 開發環境中的服務器控件提供了豐富的設計時支持。開發人員可以將服務器控件從 Visual Studio .NET 工具箱拖放到頁面上,通過 Properties(屬性)窗口訪問它們的屬性,然后在 Visual Studio HTML 編輯器以及 ASP.NET 頁面的內含代碼的類中利用 Microsoft IntelliSense® 語句完成功能。這些設計時功能為 Web 開發帶來了快速應用程序開發 (RAD) 工具,而這些工具已被 Microsoft Visual Basic® 開發人員使用了多年。

ASP.NET 還使開發人員能夠通過創建自定義服務器控件以封裝大量可重復使用的用戶界面特定的代碼(例如登錄或注冊表單),來進一步提高生產效率。盡管開發人員已經開始意識到開發自定義控件的重要性,但許多人可能還沒有意識到還能在控件中利用 Visual Studio 設計時支持的強大功能,使這些控件能夠像 ASP.NET 中的內置控件那樣易于使用。本文將介紹 Microsoft .NET Framework 和 Visual Studio .NET 提供的設計時支持的類型,并向開發人員介紹如何構建利用這種支持的控件。

設計時支持的類型

針對 Visual Studio .NET 中的服務器控件,有五種不同的設計時支持。它們是:

  • 內含代碼的類中的 IntelliSense
  • 設計視圖中的屬性瀏覽器支持
  • 工具箱支持
  • HTML 視圖中的屬性瀏覽器支持
  • HTML 編輯器中的 IntelliSense

這些設計時支持類型是由幾個不同的機制提供的。內含代碼的類中的 IntelliSense 由 IDE 啟用,IDE 為您的控件讀取元數據以確定控件所提供的屬性和方法及其類型和參數。要啟用內含代碼的類中的 IntelliSense,只需對您的控件進行編寫和編譯,然后將其程序集放到使用該控件的應用程序的 bin 子目錄中。

Visual Studio .NET 編輯器設計視圖中的屬性瀏覽器支持通過以下兩個途徑提供:將該類型與某個屬性相關聯和/或將元數據特性與該屬性相關聯。將元數據特性(下文簡稱為特性)添加到您的代碼中,用于標識屬性的類別、提供屬性說明以及在需要時指定首選編輯器。有些類型的屬性(如 System.Drawing.Color)會自動映射到 Visual Studio .NET 中的相應編輯器中。

Visual Studio .NET 的 HTML 視圖中的 IntelliSense 和屬性瀏覽器支持通過使用一種 XSD 架構進行提供,該架構用于描述與控件相關聯的類型,它使用稱為 Visual Studio 注釋的文本修飾指定控件的首選編輯器和其他首選項。

最后,您可以通過結合特性和帶有特定屬性的自定義位圖來支持從 Visual Studio .NET 工具箱拖放控件。

Blog 控件示例

用于說明 Visual Studio .NET 中的設計時功能的控件稱作“Blog 控件”,如本文末尾的列表 1 所示。該控件提供利用 XML 作為存儲介質的簡單 Web 日志功能。Web 日志通常稱為 Blog,它實際上是一個 Web 頁面,供人們在上面張貼有關日常生活、世態百象、時事政治或人們所關心的其他問題的定期觀察報告或評論。Blog 條目是通過 Web 瀏覽器添加的。

Blog 控件非常簡單明了,它利用控件組合向瀏覽器提供輸出。在組合控件中,CreateChildControls 方法(由 ASP.NET 運行時自動調用)會被重寫,利用此方法,我們可以創建構成自定義控件 UI 的控件,并將它們添加到控件的“控件”集合中。此外,該控件還包含用于顯示和添加 Blog 以及當 XML Blog 存儲文件不存在時創建一個這樣的文件的邏輯。該控件的幾個公共屬性需要開發人員在設計時進行設置,其中包括在添加新 Blog 時該控件將重定向到的頁面的 URL、與新 Blog 關聯的電子郵件地址、控件模式(顯示或添加)以及各 Blog 條目之間的分隔線的顏色。圖 1 所示為正在運行的 Blog 控件。Add Blog(添加 Blog)超鏈接由 ASP.NET 超鏈接控件提供,獨立于 Blog 控件。BlogClient.aspx 的代碼如列表 2 所示。BlogClient.aspx 的 codebehind 類如列表 3 所示,它提供單擊 Add Blog(添加 Blog)鏈接時更改 Blog 模式的邏輯。

圖 1:運行時的 Blog 控件

圖 2 所示為設計時基本 Blog 控件的外觀。請注意,雖然列出了屬性,但并未分類。

圖 2:設計時的 Blog 控件

添加設計時支持

雖然在 Web 窗體頁上使用 Blog 控件非常簡單,但并不是很直觀。例如,如果沒有相關文檔,使用 Blog 控件的人就無法知道 Mode 屬性的有效值只能是 DisplayAdd。如果未將 Add 模式的相關信息明確地告訴使用該控件的開發人員,他們就很難自己發現并使用這種模式。

對于使用 Visual Studio .NET(或支持 IntelliSense 的其他 IDE)的開發人員而言,可以通過為控件添加設計時支持來解決這一問題。這可以通過綜合利用本文前面所介紹的方法來實現。在為自定義服務器控件提供設計時支持所面臨的挑戰中,部分原因來自于在自定義控件中全面支持設計時功能所需的方法的多樣性。最簡單的、不需要任何附加編碼的是內含代碼的類中的 IntelliSense 語句完成方法,如圖 3 所示,此方法適用于 BlogClient.aspx.vb。

圖 3:內含代碼的類中的 IntelliSense

遺憾的是,語句完成功能的自動支持并沒有擴展到編輯 Web 窗體頁時的設計視圖或 HTML 視圖,而且 Visual Studio 也沒有提供不需要額外的控件工作就能在屬性瀏覽器中查看和編輯屬性的內置支持。更復雜的是,要在 Web 窗體編輯器的屬性瀏覽器和設計視圖中支持 IntelliSense,需要采用一種方法,要在該編輯器的 HTML 視圖中支持 IntelliSense,則需要采用另一種方法。

要在設計視圖中支持屬性瀏覽,所需的方法是通過特性告訴 Visual Studio .NET 如何處理屬性。要在 HTML 視圖中支持語句完成和屬性瀏覽,需要生成一個自定義 XSD 架構以描述控件中的類型。我們將在下文討論這兩種方法。

設計視圖和元數據特性

Visual Studio .NET 為使用拖放技術的動態控件設計和修改提供了豐富的支持,同時還提供了屬性瀏覽器之類的工具以及相關的設計器(例如顏色選擇器)。對這些工具的支持是通過一系列特性提供的,您可以將這些特性添加到您的控件中。這些特性用于告訴 Visual Studio IDE 是否在屬性瀏覽器中顯示控件的屬性、屬性所屬的類型以及應使用哪個設計器設置屬性的值。

對于將要提供設計時支持的控件版本,我們將制作一份控件文件 Blog.vb 的副本,并將其命名為 Blog_DT.vb,然后在副本文件上進行修改。這樣可以生成該控件的設計時版本,并保留原始控件以便進行比較。

要支持在屬性瀏覽器中編輯 AddRedirect 屬性,應在屬性進程之前添加以下特性,如以下代碼片段所示:

<Browsable(True), _
Category("行為"), _
Description("成功提交新的 Blog 條目后, " & _
   "應重定向到的 " & _
   "頁面的 URL。"), _
Editor("System.Web.UI.Design.UrlEditor", _
   GetType(UITypeEditor))> _
Public Property AddRedirect() As String
   '屬性進程代碼
End Property
    

這些特性聲明允許在屬性瀏覽器中顯示屬性、為屬性設置所需的類別(當屬性按類別排序時)、提供屬性說明并告訴 Visual Studio .NET 使用 UrlEditor 類編輯屬性的值,如圖 4 所示。

圖 4:設計視圖中的屬性支持

此處所述的特性語法適用于 Visual Basic .NET。在 Visual Basic .NET 中,特性通過以下語法進行聲明:

<AttributeName(AttributeParams)>
    

在 C# 中,特性采用如下形式:

[AttributeName(AttributeParams)]
    

Visual Basic .NET 要求特性聲明與其修改的成員位于同一行中,因此通常最好在特性后面跟一個 Visual Basic 行接續字符以提高可讀性:

<AttributeName(AttributeParams)> _
Public Membername()
    

在 C# 和 Visual Basic 中,您可以在一對 [ ] 或 <> 括號中聲明多個特性,特性之間用逗號分隔。而在 Visual Basic .NET 中,如果它們出現在不同的行中,則必須使用 Visual Basic 行接續符銜接特性,使其位于同一個語句中。

添加工具箱支持

除了設置屬性級別的特性外,還可設置某些類和程序集級別的特性。例如,您可以使用程序集級別的特性 TagPrefix 來指定標記前綴,供程序集中包含的任何控件使用。之后,當您從 Visual Studio 工具箱中向某個 Web 窗體頁上添加該控件的實例時,Visual Studio .NET 將自動插入這個標記前綴。以下代碼片段顯示了 TagPrefix 特性的語法。該特性應放置在定義該控件的類模塊內,但應在類和命名空間聲明之外(請注意,在 Visual Basic .NET 項目中,命名空間是在項目級別定義的,因此您不用擔心如何將程序集特性放置到命名空間聲明之外)。在以下特性中,TagPrefix 特性的第一個參數是控件的命名空間,第二個參數是您希望為標記前綴使用的文本。

<Assembly: TagPrefix("BlogControl", "BlogControl")>
    

要將控件集成到 Visual Studio .NET 環境中,應將 ToolBoxData 特性(該特性用于告訴 Visual Studio .NET 從工具箱中為控件插入的首選標記名)添加到實現該控件的類中:

<ToolboxData("<{0}:Blog_DT runat=server></{0}:Blog_DT>")> _
Public Class Blog_DT
   Inherits Panel
   Implements INamingContainer
   '控件實現
End Class
    

將控件從工具箱中插入到頁面上時,由 TagPrefix 特性指定的標記前綴將插入 {0} 占位符,而其他文本將按原樣插入。

您還可以為控件提供自己的自定義圖標,以顯示在工具箱中。為此,需要創建一個 16 x 16 像素大小的位圖(左下方的像素采用透明色),其名稱與包含該控件的類相同(即 classname.bmp)。使用 Add Existing Item(添加現有項)命令將該位圖添加到項目中,然后使用屬性瀏覽器將其 Build Action(創建操作)設置為 Embedded Resource(內置資源),如圖 5 所示。

圖 5:設置 Build Action(創建操作)

編譯完成后,該控件將支持從工具箱中將控件添加到某個頁面中時為 Blog 控件自動插入 @Register 指令、標記前綴和標記名,并在工具箱中顯示自定義圖標,如圖 6 所示。要將控件添加到 Visual Studio .NET 工具箱中,應完成以下簡單步驟:

  1. 在設計視圖中,選擇 Visual Studio .NET 工具箱的 Web forms(Web 窗體)選項卡。
  2. 在該選項卡上的任意位置單擊鼠標右鍵,然后選擇 Add/Remove Items(添加項目/刪除項目)(Visual Studio .NET 2002 中為 Customize Toolbox [自定義工具箱])。
  3. 選擇 .NET Framework Components(.NET Framework 組件)選項卡,然后單擊 Browse(瀏覽)。
  4. 瀏覽到編譯后的控件程序集所在的位置,選中它并單擊 Open(打開)。
  5. 單擊 OK(確定)。

圖 6:工具箱中的自定義控件

將控件添加到工具箱中后,可以通過雙擊該控件或將其從工具箱中拖放到 Web 窗體頁上,將其添加到 Web 窗體頁中。無論何種情況,Visual Studio .NET 都會自動插入正確的 @Register 指令(包括基于程序集級別的特性設置 TagPrefix),還將使用 ToolBoxData 屬性中指定的標記名為該控件生成一組標記。

添加設計器

正如前文所述,Blog 控件在 Web 窗體編輯器的設計視圖中沒有任何可視界面。這使得選擇頁面上的控件很困難,更難以理解控件在運行時的外觀。為了解決這個問題,我們可以添加設計器支持,使設計時的 HTML 在外觀上接近于運行時的 Blog 控件。請注意,您還可以生成可以完整再現控件運行時輸出的設計器,但此操作相當復雜,而且超出了本文的討論范圍。

所有服務器控件設計器都是從類 System.Web.UI.Design.ControlDesigner 派生而來,該類提供了大量方法,您可以重寫這些方法為您的控件提供設計時渲染。以下代碼簡單重寫了 GetDesignTimeHtml 方法,返回設計時顯示的簡單 HTML。請注意,該示例顯示了 Blog 控件的整個設計器類,您可以簡單地將其添加到現有的 Blog_DT.vb 類文件中。

Public Class BlogDesigner
   Inherits ControlDesigner

   Public Overrides Function GetDesignTimeHtml() As String
      Return "<h1>Blog</h1><hr/><hr/>"
   End Function

End Class
    

要將該設計器綁定到 Blog_DT 類中,我們使用了 Designer 特性,如以下片段所示。請注意,此段代碼還添加了一個描述控件功能的 Description 特性。

<Description("簡單 Blog 控件。支持顯示 " & _
   "Web 日志/來自 XML 文件的新條目。"), _
Designer("BlogControl.BlogDesigner"), _
ToolboxData("<{0}:Blog_DT runat=server></{0}:Blog_DT>")> _
Public Class Blog_DT
   Inherits Panel
   Implements INamingContainer
    

如您所見,BlogDesigner 類非常簡單,但它為控件在 Web 窗體頁上的設計時外觀添加了大量內容,如圖 7 所示。

圖 7:添加設計時渲染

列表 4 顯示了 Blog 控件的代碼,它已經使用特性進行了更新,以啟用設計視圖和屬性瀏覽器中的控件設計時支持。請注意,該示例添加了多條 using 指令,以導入支持我們使用的特性和設計器類所需要的命名空間。這個新列表還添加了一個用于 Mode 屬性值的枚舉。

HTML 視圖支持:自定義架構和 Visual Studio 注釋

盡管前文所述的特性幫助我們為 Blog 控件提供了設計時支持,但這里遺漏了一個重要的問題:在 Web 窗體編輯器的 HTML 視圖中添加標記和特性的 IntelliSense 支持。對于那些認為在 HTML 環境中工作比在“所見即所得”風格的環境中工作更舒適的開發人員來說,這是一個極大的疏忽。

因為 Web 窗體編輯器的 HTML 視圖使用 XSD 架構決定在 Web 窗體頁上提供哪些元素和特性,所以為了糾正這一問題,我們需要提供一個描述 Blog 控件及其所支持的特性的 XSD 架構。也可以在該架構中添加注釋,告訴 Visual Studio .NET 各種元素的有關信息以及我們所希望的元素行為。

列表 5 包含 Blog 控件特定的 XSD 架構的部分內容。實際的架構文件(可從本文的示例代碼中獲得)還包含面板控件(Blog_DT 控件就是由它派生的)的類型定義以及其他必需的特性和類型定義。這些定義是從為內置 ASP.NET 服務器控件創建的 asp.xsd 架構文件中復制的。

請注意,任何時候都不應直接修改 asp.xsd 架構文件,而只應將必需的類型和特性定義復制到您的自定義架構文件中。盡管這看起來是多余的,但如果直接編輯 asp.xsd,以后安裝 .NET Framework 或服務包時該文件將被覆蓋,您的自定義輸入項將因此而丟失。

列表 5 中,請注意根架構元素上的 targetNamespacexmlns 特性,這兩個特性用于為控件的架構定義 XML 命名空間。targetNamespace 和 xmlns 特性的值還將用于 Web 窗體頁中的特性,以“綁定”該架構。<xsd:element> 標記定義根 Blog_DT 元素。<xsd:complexType> 標記定義 Blog_DT 元素的特性,包括 <xsd:attributeGroup> 標記引用的 Web 控件特性。最后,<xsd:simpleType> 標記定義 BlogMode 類型的枚舉,該類型被用作 Blog_DT 元素的一個特性。

請注意,列表 5 使用 vs:builder 注釋來告訴 Visual Studio .NET 對 AddRedirect 特性使用 URL 生成器,而對 SeparatorColor 特性使用顏色生成器。vs:builder 注釋是可用于修改架構的注釋之一。表 1 列出了最常用的注釋。

表 1:常用的 Visual Studio .NET 注釋

注釋 用途 有效值
vs:absolutepositioning 在根 <schema> 元素上使用,用于確定 Visual Studio 是否可以插入用于定位的樣式特性。 true 或 false
vs:blockformatted 表明是否可以在自動格式化期間為元素添加前導空格。 true 或 false
vs:builder 指定用于編輯相關屬性值的生成器。 顏色、樣式或 URL
vs:deprecated 允許將某個相關屬性標記為“已否決”,以防止其在屬性瀏覽器和語句完成中出現。 true 或 false
vs:empty 在元素級別使用,用于指示 Visual Studio .NET 應對相關標記(無結束標記)使用一個標記語法。 true 或 false
vs:friendlyname 在根級別使用,用于為架構提供顯示名。  
vs:iscasesensitive 在根級別使用,說明 Visual Studio .NET 是否以區分大小寫的方式處理相關標記。 true 或 false
vs:ishtmlschema 在根級別使用,說明架構是否是一個 HTML 文檔架構。 true 或 false
vs:nonbrowseable 在特性級別使用,說明該特性不應出現在語句完成中。 true 或 false
vs:readonly 在特性級別使用,說明不能在屬性窗口中修改該特性。 true 或 false
vs:requireattributequotes 在根級別使用,說明特性值必須用引號括起。 true 或 false

創建自己的 XSD 架構后,可以將其與 asp.xsd 文件保存到同一位置(在 Visual Studio .NET 2003 中,默認為 C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\schemas\xml\)。

要允許 Visual Studio .NET 讀取您的自定義架構,需要將一個 xmlns 特性添加到要使用該架構的頁面的 <body> 標記中,如以下代碼片段所示:

<body xmlns:BlogControl="urn://www.aspnetian.com/schemas">
    

請注意,此段代碼使用具有 xmlns 特性的 BlogControl 前綴來說明該架構適用于帶有 BlogControl 標記前綴的控件,這個可以再次調用的前綴是使用 TagPrefix 特性進行設置的(有關該特性的說明,請參見上文中的“元數據特性”一節)。xmlns 特性的值應與架構根元素中定義的 targetNamespace 特性的值相同。

通過 xmlns 特性綁定架構之后,即可鍵入一個開放的“<”字符,并使 Blog 控件顯示為語句完成的一個選項,如圖 8 所示。此時,還應獲取已定義屬性的語句完成,包括 Mode 屬性的有效值,以及由 XSD 文件中的注釋指定的生成器。

圖 8:HTML 視圖中的語句完成

小結

本文介紹了 Visual Studio .NET 中適用于 ASP.NET 服務器控件的設計時支持,還說明了開發人員如何在自己的自定義控件中利用這一支持功能。雖然在控件中添加設計時支持相對簡明,但要充分利用這些功能卻需要掌握多種不同的技巧。特別欠缺的知識領域就是如何將自定義 XSD 架構綁定到頁面上。在撰寫本文時,還不具備將頁面與控件 XSD 架構連接起來所需的 xmlns 特性的內置支持。所以,還需要手動添加這個特性。希望以后的 Visual Studio .NET 版本能夠自動完成這一過程。

本文中的示例代碼包含一個適用于 Blog 控件基礎版和設計時支持版的 Visual Studio .NET 項目,還包含一個說明如何使用每個控件的客戶端項目。要運行 BlogControlClient 項目,您需要在 IIS 中創建一個虛擬目錄 BlogControlClient,然后將其映射到硬盤驅動器上用于保存 BlogControlClient 項目文件夾的位置。

真誠地感謝 Microsoft Visual Studio .NET 團隊的 Rob Caron,他在我編寫自定義 XSD 架構的創建和綁定過程中給予了極大的幫助。

作者介紹

G. Andrew Duthie 是 Graymad Enterprises, Inc.(英文)的創始人和負責人,該公司提供 Microsoft Web 開發技術的培訓和咨詢服務。自從 Active Server Pages 問世以來,Andrew 一直從事多層 Web 應用程序的開發工作。他編寫了大量有關 ASP.NET 的著作,其中包括:《Microsoft ASP.NET Step By Step》、《Microsoft ASP.NET Programming with Microsoft Visual Basic》和《ASP.NET in a Nutshell》。Andrew 經常在一些重大活動中發表演講,這些活動包括“Software Development”、“Dev-Connections family of conferences”、“Microsoft Developer Days”以及“VSLive!”。他還作為 International .NET Association (INETA)(英文)Speaker's Bureau 成員在 .NET 用戶組上發表了演講。您可以從其公司的 Web 站點 Graymad Enterprises, Inc.(英文)上了解到有關 Andrew 的更多信息。

本文是根據《ASP.NET in a Nutshell》第二版(ISBN:0596001169)改編而成,其作者包括 G. Andrew Duthie 和 Matthew MacDonald,由 O'Reilly & Associates, Inc. 于 2003 年出版。

代碼列表

列表 1:Blog.vb

'supports Color structure
Imports System.Drawing
'支持 StreamWriter 類型
Imports System.IO
Imports System.Web.UI
'支持使用 HTML 控件
Imports System.Web.UI.HtmlControls
'支持使用 Web 控件
Imports System.Web.UI.WebControls

Public Class Blog
   Inherits Panel
   Implements INamingContainer

   Protected BlogDS As DataSet
   Protected TitleTB As TextBox
   Protected BlogText As TextBox

   Private _addRedirect As String
   Private _email As String
   Private _mode As String
   Private _separatorColor As Color = Color.Black

   Public Property AddRedirect() As String
      Get
         Return Me._addRedirect
      End Get
      Set(ByVal Value As String)
         Me._addRedirect = Value
      End Set
   End Property

   Public Property Email() As String
      Get
         Return Me._email
      End Get
      Set(ByVal Value As String)
         Me._email = Value
      End Set
   End Property

   Public Property Mode() As String
      Get
         Return Me._mode
      End Get
      Set(ByVal Value As String)
         Me._mode = Value
      End Set
   End Property

   Public Property SeparatorColor() As Color
      Get
         Return Me._separatorColor
      End Get
      Set(ByVal Value As Color)
         Me._separatorColor = Value
      End Set
   End Property

   Protected Overrides Sub OnInit(ByVal e As EventArgs)
      LoadData()
      MyBase.OnInit(e)
   End Sub

   Protected Overrides Sub CreateChildControls()
      If Not Me._mode = "Add" Then
         DisplayBlogs()
      Else
         NewBlog()
      End If
   End Sub

   Protected Sub LoadData()
      BlogDS = New DataSet()

      Try
         BlogDS.ReadXml(Page.Server.MapPath("Blog.xml"))
      Catch fnfEx As FileNotFoundException
         CreateBlankFile()
         LoadData()
      End Try
   End Sub

   Protected Sub DisplayBlogs()
      Dim BlogDate As DateTime
      Dim CurrentDate As DateTime = New DateTime()
      Dim BlogRows As DataRowCollection = _
         BlogDS.Tables(0).Rows
      Dim BlogDR As DataRow
      For Each BlogDR In BlogRows
         Dim BDate As String = BlogDR("date").ToString()
         BlogDate = New DateTime _
            (Convert.ToInt32(BDate.Substring(4, 4)), _
            Convert.ToInt32(BDate.Substring(0, 2)), _
            Convert.ToInt32(BDate.Substring(2, 2)))

         If Not CurrentDate = BlogDate Then
            Dim TempDate As Label = New Label()
            TempDate.Text = BlogDate.ToLongDateString()
            TempDate.Font.Size = FontUnit.Large
            TempDate.Font.Bold = True
            Me.Controls.Add(TempDate)
            Me.Controls.Add _
               (New LiteralControl("<br/><br/>"))
            CurrentDate = BlogDate
         End If

         Dim Anchor As HtmlAnchor = New HtmlAnchor()
         Anchor.Name = "#" & BlogDR("anchorID").ToString()
         Me.Controls.Add(Anchor)

         Dim Title As Label = New Label()
         Title.Text = BlogDR("title").ToString()
         Title.Font.Size = FontUnit.Larger
         Title.Font.Bold = True
         Me.Controls.Add(Title)

         Me.Controls.Add(New LiteralControl("<p>"))
         Dim BlogText As LiteralControl = _
            New LiteralControl("<div>" & _
            BlogDR("text").ToString() & "</div>")
         Me.Controls.Add(BlogText)
         Me.Controls.Add(New LiteralControl("</p>"))

         Dim Email As HyperLink = New HyperLink()
         Email.NavigateUrl = "mailto:" & _
            BlogDR("email").ToString()
         Email.Text = "E-mail me"
         Me.Controls.Add(Email)

         Me.Controls.Add(New LiteralControl(" | "))
         Dim AnchorLink As HyperLink = New HyperLink()
         AnchorLink.NavigateUrl = _
            Page.Request.Url.ToString() & "#" & _
            BlogDR("anchorID").ToString()
         AnchorLink.Text = "Link"
         Me.Controls.Add(AnchorLink)

         Me.Controls.Add(New _
            LiteralControl("<hr color='" & _
            ColorTranslator.ToHtml(_separatorColor) & _
            "' width='100%'/><br/>"))
      Next
   End Sub

   Protected Sub NewBlog()
      Dim Title As Label = New Label()
      Title.Text = "Create New Blog"
      Title.Font.Size = FontUnit.Larger
      Title.Font.Bold = True
      Me.Controls.Add(Title)

      Me.Controls.Add(New LiteralControl("<br/><br/>"))

      Dim TitleLabel As Label = New Label()
      TitleLabel.Text = "Title: "
      TitleLabel.Font.Bold = True
      Me.Controls.Add(TitleLabel)
      TitleTB = New TextBox()
      Me.Controls.Add(TitleTB)

      Me.Controls.Add(New LiteralControl("<br/>"))

      Dim BlogTextLabel As Label = New Label()
      BlogTextLabel.Text = "Text: "
      BlogTextLabel.Font.Bold = True
      Me.Controls.Add(BlogTextLabel)
      BlogText = New TextBox()
      BlogText.TextMode = TextBoxMode.MultiLine
      BlogText.Rows = 10
      BlogText.Columns = 40
      Me.Controls.Add(BlogText)

      Me.Controls.Add(New LiteralControl("<br/>"))

      Dim Submit As Button = New Button()
      Submit.Text = "Submit"
      AddHandler Submit.Click, AddressOf Me.Submit_Click
      Me.Controls.Add(Submit)
   End Sub

   Protected Sub Submit_Click(ByVal Sender As Object, _
      ByVal e As EventArgs)
      EnsureChildControls()
      AddBlog()
   End Sub

   Protected Sub AddBlog()
      Dim NewBlogDR As DataRow
      NewBlogDR = BlogDS.Tables(0).NewRow()
      NewBlogDR("date") = FormatDate(DateTime.Today)
      NewBlogDR("title") = TitleTB.Text
      NewBlogDR("text") = BlogText.Text
      NewBlogDR("anchorID") = Guid.NewGuid().ToString()
      NewBlogDR("email") = _email
      BlogDS.Tables(0).Rows.InsertAt(NewBlogDR, 0)
      BlogDS.WriteXml(Page.Server.MapPath("Blog.xml"))
      Page.Response.Redirect(_addRedirect)
   End Sub

   Protected Function FormatDate(ByVal dt As DateTime) _
      As String
      Dim retString As String
      retString = String.Format("{0:D2}", dt.Month)
      retString &= String.Format("{0:D2}", dt.Day)
      retString &= String.Format("{0:D2}", dt.Year)
      Return retString
   End Function

   Public Sub CreateBlankFile()
      Dim NewXml As StreamWriter = _
         File.CreateText(Page.Server.MapPath("Blog.xml"))

      NewXml.WriteLine("<blogs>")
      NewXml.WriteLine _
         ("   <!-- blog field describes a single blog -->")
      NewXml.WriteLine("   <blog>")
      NewXml.WriteLine("      <!-- date field contains" & _
         " the creation date of the blog -->")
      NewXml.WriteLine("      <date>" & _
         FormatDate(DateTime.Today) & "</date>")
      NewXml.WriteLine _
         ("      <title>Temporary Blog</title>")
      NewXml.WriteLine("      <!-- text field " & _
         "should contain the blog text, including any " & _
         "desired HTML tags -->")
      NewXml.WriteLine("      <text>This entry " & _
         "indicates that the file blog.xml was not " & _
         "found.A default version of this file has " & _
         "been created for you.You can modify the " & _
         "fields in this file as desired.If you set " & _
         "the Blog control to add mode (add the " & _
         "attribute mode='add' to the control's " & _
         "declaration), the control will " & _
         "automatically populate the XML file when " & _
         "you submit the form.</text>")
      NewXml.WriteLine("      <!-- anchorID field " & _
         "will be autopopulated by the control -->")
      NewXml.WriteLine("      <anchorID></anchorID>")
      NewXml.WriteLine("      <!-- email field should" & _
         " contain the email address for feedback -->")
      NewXml.WriteLine("      <email>change this to a " & _
         "valid email address</email>")
      NewXml.WriteLine("   </blog>")
      NewXml.WriteLine("</blogs>")
      NewXml.Close()
   End Sub

End Class
    

列表 2:BlogClient.aspx

<%@ Register TagPrefix="cc1" Namespace="BlogControl"
   Assembly="BlogControl" %>
<%@ Page Language="vb" AutoEventWireup="false"
   Codebehind="BlogClient.aspx.vb"
   Inherits="BlogControlClient.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
   Transitional//EN">
<html>
  <head>
   <title>Blog Client</title>
  </head>
<body>
   <form id=Form1 method=post runat="server">
      <p><asp:hyperlink id=Link1 
            navigateurl="BlogClient.aspx?mode=add"
            runat="server">Add Blog</asp:hyperlink></p>
      <cc1:blog 
         id=Blog1 
         Email="andrew@graymad.com" 
         AddRedirect="BlogClient.aspx" 
         SeparatorColor="LawnGreen"
         runat="server"></cc1:blog>
      <p><asp:hyperlink id=Link2 
            navigateurl="BlogClient.aspx?mode=add"
            runat="server">Add Blog</asp:hyperlink></p>
   </form>
</body>
</html>
    

列表 3:BlogClient.aspx.vb

Imports BlogControl

Public Class WebForm1
    Inherits System.Web.UI.Page
      Protected WithEvents Link1 As _
         System.Web.UI.WebControls.HyperLink
      Protected WithEvents Link2 As _
         System.Web.UI.WebControls.HyperLink
      Protected WithEvents Blog1 As BlogControl.Blog

   Private Sub Page_Load(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles MyBase.Load
      If Request.QueryString("mode") = "add" Then
         Blog1.Mode = "Add"
         Link1.Visible = False
         Link2.Visible = False
      Else
         Blog1.Mode = "Display"
         Link1.Visible = True
         Link2.Visible = True
      End If
   End Sub

End Class
    

列表 4:Blog_DT.vb

'支持設計時特性
Imports System.ComponentModel
'支持顏色結構
Imports System.Drawing
'支持 UITypeEditor 類型
Imports System.Drawing.Design
'支持 StreamWriter 類型
Imports System.IO
Imports System.Web.UI
'支持 ControlDesigner 類型
'  請注意,必須添加程序集
'  System.Design 的引用,才能導入此命名空間
Imports System.Web.UI.Design
'支持使用 HTML 控件
Imports System.Web.UI.HtmlControls
'支持使用 Web 控件
Imports System.Web.UI.WebControls

<Assembly: TagPrefix("BlogControl", "BlogControl")> 

Public Enum BlogMode
   Add
   Display
End Enum

<Description("Simple Blog control.Supports display " & _
   "of Web log / news items from an XML file."), _
Designer("BlogControl.BlogDesigner"), _
ToolboxData("<{0}:Blog_DT runat=server></{0}:Blog_DT>")> _
Public Class Blog_DT
   Inherits Panel
   Implements INamingContainer

   Protected BlogDS As DataSet
   Protected TitleTB As TextBox
   Protected BlogText As TextBox

   Private _addRedirect As String
   Private _email As String
   Private _mode As BlogMode
   Private _separatorColor As Color = Color.Black

   <Browsable(True), _
   Category("Behavior"), _
   Description("URL to which the page should redirect after successful submission of a new Blog entry."), _
   Editor("System.Web.UI.Design.UrlEditor", _
      GetType(UITypeEditor))> _
   Public Property AddRedirect() As String
      Get
         Return Me._addRedirect
      End Get
      Set(ByVal Value As String)
         Me._addRedirect = Value
      End Set
   End Property

   <Browsable(True), _
   Category("Behavior"), _
   Description("Email address the control will use for listing in new Blog entries.")> _
   Public Property Email() As String
      Get
         Return Me._email
      End Get
      Set(ByVal Value As String)
         Me._email = Value
      End Set
   End Property

   <Browsable(True), _
   Category("Behavior"), _
   Description("Controls whether existing Blogs are displayed, or fields for creating a new Blog entry.")> _
   Public Property Mode() As BlogMode
      Get
         Return Me._mode
      End Get
      Set(ByVal Value As BlogMode)
         Me._mode = Value
      End Set
   End Property

   <Browsable(True), _
   Category("Appearance"), _
   Description("Controls the color of the line that separates Blog entries when in display mode.")> _
   Public Property SeparatorColor() As Color
      Get
         Return Me._separatorColor
      End Get
      Set(ByVal Value As Color)
         Me._separatorColor = Value
      End Set
   End Property

   Protected Overrides Sub OnInit(ByVal e As EventArgs)
      LoadData()
      MyBase.OnInit(e)
   End Sub

   Protected Overrides Sub CreateChildControls()
      If Not Me._mode = BlogMode.Add Then
         DisplayBlogs()
      Else
         NewBlog()
      End If
   End Sub

   Protected Sub LoadData()
      BlogDS = New DataSet()

      Try
         BlogDS.ReadXml(Page.Server.MapPath("Blog.xml"))
      Catch fnfEx As FileNotFoundException
         CreateBlankFile()
         LoadData()
      End Try
   End Sub

   Protected Sub DisplayBlogs()
      Dim BlogDate As DateTime
      Dim CurrentDate As DateTime = New DateTime()

      Dim BlogRows As DataRowCollection = _
         BlogDS.Tables(0).Rows
      Dim BlogDR As DataRow
      For Each BlogDR In BlogRows
         Dim BDate As String = BlogDR("date").ToString()
         BlogDate = New DateTime _
            (Convert.ToInt32(BDate.Substring(4, 4)), _
            Convert.ToInt32(BDate.Substring(0, 2)), _
            Convert.ToInt32(BDate.Substring(2, 2)))

         If Not CurrentDate = BlogDate Then
            Dim TempDate As Label = New Label()
            TempDate.Text = BlogDate.ToLongDateString()
            TempDate.Font.Size = FontUnit.Large
            TempDate.Font.Bold = True
            Me.Controls.Add(TempDate)
            Me.Controls.Add _
               (New LiteralControl("<br/><br/>"))
            CurrentDate = BlogDate
         End If

         Dim Anchor As HtmlAnchor = New HtmlAnchor()
         Anchor.Name = "#" + BlogDR("anchorID").ToString()
         Me.Controls.Add(Anchor)

         Dim Title As Label = New Label()
         Title.Text = BlogDR("title").ToString()
         Title.Font.Size = FontUnit.Larger
         Title.Font.Bold = True
         Me.Controls.Add(Title)

         Me.Controls.Add(New LiteralControl("<p>"))
         Dim BlogText As LiteralControl = _
            New LiteralControl("<div>" & _
            BlogDR("text").ToString() & "</div>")
         Me.Controls.Add(BlogText)
         Me.Controls.Add(New LiteralControl("</p>"))

         Dim Email As HyperLink = New HyperLink()
         Email.NavigateUrl = "mailto:" & _
            BlogDR("email").ToString()
         Email.Text = "E-mail me"
         Me.Controls.Add(Email)

         Me.Controls.Add(New LiteralControl(" | "))
         Dim AnchorLink As HyperLink = New HyperLink()
         AnchorLink.NavigateUrl = _
            Page.Request.Url.ToString() & "#" & _
            BlogDR("anchorID").ToString()
         AnchorLink.Text = "Link"
         Me.Controls.Add(AnchorLink)

         Me.Controls.Add _
            (New LiteralControl("<hr color='" & _
            ColorTranslator.ToHtml(_separatorColor) & _
            "' width='100%'/><br/>"))
      Next
   End Sub

   Protected Sub NewBlog()
      Dim Title As Label = New Label()
      Title.Text = "Create New Blog"
      Title.Font.Size = FontUnit.Larger
      Title.Font.Bold = True
      Me.Controls.Add(Title)

      Me.Controls.Add(New LiteralControl("<br/><br/>"))

      Dim TitleLabel As Label = New Label()
      TitleLabel.Text = "Title: "
      TitleLabel.Font.Bold = True
      Me.Controls.Add(TitleLabel)
      TitleTB = New TextBox()
      Me.Controls.Add(TitleTB)

      Me.Controls.Add(New LiteralControl("<br/>"))

      Dim BlogTextLabel As Label = New Label()
      BlogTextLabel.Text = "Text: "
      BlogTextLabel.Font.Bold = True
      Me.Controls.Add(BlogTextLabel)
      BlogText = New TextBox()
      BlogText.TextMode = TextBoxMode.MultiLine
      BlogText.Rows = 10
      BlogText.Columns = 40
      Me.Controls.Add(BlogText)

      Me.Controls.Add(New LiteralControl("<br/>"))

      Dim Submit As Button = New Button()
      Submit.Text = "Submit"
      AddHandler Submit.Click, AddressOf Me.Submit_Click
      Me.Controls.Add(Submit)
   End Sub

   Protected Sub Submit_Click(ByVal Sender As Object, _
      ByVal e As EventArgs)
      EnsureChildControls()
      AddBlog()
   End Sub

   Protected Sub AddBlog()
      Dim NewBlogDR As DataRow
      NewBlogDR = BlogDS.Tables(0).NewRow()
      NewBlogDR("date") = FormatDate(DateTime.Today)
      NewBlogDR("title") = TitleTB.Text
      NewBlogDR("text") = BlogText.Text
      NewBlogDR("anchorID") = Guid.NewGuid().ToString()
      NewBlogDR("email") = _email
      BlogDS.Tables(0).Rows.InsertAt(NewBlogDR, 0)
      BlogDS.WriteXml(Page.Server.MapPath("Blog.xml"))
      Page.Response.Redirect(_addRedirect)
   End Sub

   Protected Function FormatDate(ByVal dt As DateTime) As String
      Dim retString As String
      retString = String.Format("{0:D2}", dt.Month)
      retString &= String.Format("{0:D2}", dt.Day)
      retString &= String.Format("{0:D2}", dt.Year)
      Return retString
   End Function

   Public Sub CreateBlankFile()
      Dim NewXml As StreamWriter = _
         File.CreateText(Page.Server.MapPath("Blog.xml"))

      NewXml.WriteLine("<blogs>")
      NewXml.WriteLine _
         ("   <!-- blog field describes a single blog -->")
      NewXml.WriteLine("   <blog>")
      NewXml.WriteLine("      <!-- date field contains" & _
         " the creation date of the blog -->")
      NewXml.WriteLine("      <date>" & _
         FormatDate(DateTime.Today) & "</date>")
      NewXml.WriteLine _
         ("      <title>Temporary Blog</title>")
      NewXml.WriteLine("      <!-- text field " & _
         "should contain the blog text, including any " & _
         "desired HTML tags -->")
      NewXml.WriteLine("      <text>This entry " & _
         "indicates that the file blog.xml was not " & _
         "found.A default version of this file has " & _
         "been created for you.You can modify the " & _
         "fields in this file as desired.If you set " & _
         "the Blog control to add mode (add the " & _
         "attribute mode='add' to the control's " & _
         "declaration), the control will " & _
         "automatically populate the XML file when " & _
         "you submit the form.</text>")
      NewXml.WriteLine("      <!-- anchorID field " & _
         "will be autopopulated by the control -->")
      NewXml.WriteLine("      <anchorID></anchorID>")
      NewXml.WriteLine("      <!-- email field should" & _
         " contain the email address for feedback -->")
      NewXml.WriteLine("      <email>change this to a " & _
         "valid email address</email>")
      NewXml.WriteLine("   </blog>")
      NewXml.WriteLine("</blogs>")
      NewXml.Close()
   End Sub

End Class

Public Class BlogDesigner
   Inherits ControlDesigner

   Public Overrides Function GetDesignTimeHtml() As String
      Return "<h1>Blog</h1><hr/><hr/>"
   End Function

End Class
    

列表 5:Blog.xsd

<?xml version="1.0" encoding="utf-8" ?> 
<xsd:schema
   targetNamespace="urn://www.aspnetian.com/schemas"
   elementFormDefault="qualified"
   xmlns="urn://www.aspnetian.com/schemas"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:vs="http://schemas.microsoft.com/Visual-Studio-Intellisense"
   vs:friendlyname="Blog Control Schema"
   vs:ishtmlschema="false" 
   vs:iscasesensitive="false" 
   vs:requireattributequotes="true" >
   <xsd:annotation>
      <xsd:documentation>
         Blog Control schema.
      </xsd:documentation>
   </xsd:annotation>

   <xsd:element name="Blog_DT" type="BlogDef" />

   <!-- <aspnetian:Blog> -->
   <xsd:complexType name="BlogDef">
      <!-- <aspnetian:Blog>-specific attributes -->
      <xsd:attribute name="AddRedirect" type="xsd:string"
         vs:builder="url"/>
      <xsd:attribute name="Email" type="xsd:string"/>
      <xsd:attribute name="Mode" type="BlogMode"/>
      <xsd:attribute name="SeparatorColor"
         type="xsd:string" 
         vs:builder="color"/>
      <!-- <asp:Panel>-specific attributes -->
      <xsd:attribute name="BackImageUrl" 
         type="xsd:anyURI" />
      <xsd:attribute name="HorizontalAlign"
         type="HorizontalAlign" />
      <xsd:attribute name="Wrap" type="xsd:boolean" />
      <xsd:attribute name="Enabled" type="xsd:boolean" />
      <xsd:attribute name="BorderWidth" type="ui4" />
      <xsd:attribute name="BorderColor" type="xsd:string" 
         vs:builder="color" />
      <xsd:attribute name="BorderStyle" 
         type="BorderStyle" />
      <xsd:attributeGroup ref="WebControlAttributes" />
   </xsd:complexType>

   <!-- DataTypes -->
   <xsd:simpleType name="BlogMode">
      <xsd:restriction base="xsd:string">
         <xsd:enumeration value="Add" />
         <xsd:enumeration value="Display" />
      </xsd:restriction>
   </xsd:simpleType>
</xsd:schema>
    

標簽:

本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn


為你推薦

  • 推薦視頻
  • 推薦活動
  • 推薦產品
  • 推薦文章
  • 慧都慧問
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
91精品国产91久久久久 | 激情综合网+黄色成人网 | 欧美系列 | 在线观看无码国 | 午夜无码视频一区二区三区 | 爆操内射 | 欧美熟妇性饥渴在线观看 | 成人动漫h在线观看 | 亚洲午夜精品a片一区三区无码 | 麻豆果冻传媒av人妻少妇无码 | 亚洲国产欧美一区二区三区 | 无码久久精品免费 | 欧美精品91久久久 | 91久久偷偷看嫩草影院无费 | 日本中文字 | 亚洲三级片在线观看 | 日韩一区二区综合精品 | 成年女人免费毛片视频永久vip | 久久av老司机精品网站导航 | 国产精品va在线观看无码不卡 | 成人黄色在线观看 | 欧美亚洲另类偷自拍 | 国产在线播精品第三 | 97se狠狠狠狠狼鲁亚洲综合色 | 自在自线国产精品 | 国产免费伦精品一区二区三区 | 99re8精品视频在线播放 | 97视频在线观看精品 | 精品在线看 | 东京热无码av一区二区 | 久草超碰在线 | 日韩免费人妻av无码专区蜜桃 | 日韩无码久久 | 亚洲av永久| 91精品观看91久久久久久 | 中文字幕乱 | 国产精品分类视频分类一区 | 国产aⅴ | 亚洲无码在线观看免费视频 | 久久91亚洲精品久久91综合 | 插我舔内射18免费 | 国产一级毛片午夜福利 | 欧美日韩国产中文区页 | 亚洲成a人片 | 亚洲国产成人一区二区精品区 | 国产精品视频观看久久 | 日韩a一级 | 国产在线自在拍91 | 亚洲av无码一区二区二三区 | 天美传媒在线观看果冻传媒 | 国产一级一级毛片真人视频 | 91蜜桃传媒精品久久久一区二区 | 欧美一区二区三区无码大象视频 | 黄网站免费在线观看日韩 | 日韩精品无码免费专区丶 | 亚洲综合自拍 | 亚洲91综合狠狠 | 成人福利| 无码国产69精品久久久孕妇 | 国内精品久久久久久99 | 精品人妻无码一区二区三区四川人 | 在线视频91 | 午夜成人网站在线观看 | 无码国产精品一区二区vr | 亚洲午夜一区二区三区在线观看 | 国产精品热九九无码aⅴ | 国产h片无码不卡在线视频 国产h片在线观看视 | 欧美一级乱理片免费观看 | 国产资源大尺度在线播放 | 欧美日韩欧 | 少妇久久久久久被弄到高潮 | 日本熟妇色一本在线观看 | 在线免费观看成年人视频 | 亚洲av永久无码一区二区三区 | 91se在线观看一区二区 | 亚洲国产精品看片在线观看 | 精品日韩国产欧美视频 | 国产成人亚洲综合无码ⅴ | 欧美午夜剧场 | 亚洲av成人无 | 区不卡二区不卡三区 | 亚洲精品欧美综合第四区 | 91男女免费福利 | 国精品99久9在线 | 99精品国产在热久久无码 | 国产一区二区在线播放 | 极品人妻少妇 | 亚洲一区公司在线 | 精品国产成人亚洲午夜福利 | 成人国产精品视频 | 性欧美video| 国内精品久久久久久久97牛牛 | 国产一级精品成人大片综合高清不卡 | 91精品国产高久久久久久五月天 | 国产精品视频六区 | 日本三级网站在线观看 | 成年人在线免费观看视频网站 | 精品无码成人网站久久久久久 | 亚洲av中文无码字幕色 | 国产精品福利电影一区二 | 黑人巨大无码中文字幕无码 | 无码一级毛片免费 | 欧美精品三级一区二区三区 | 亚洲av永久无码精品三区在线 | 国产色啪a∨在线看精品 | 1区2区3区4区产品乱码99 | 无码不卡 | 国产乱人伦偷精品视频色欲 | 亚洲成aⅴ人片在线观看无码 | 国产精品无码无 | 国产亚av手机在 | 国产91色综合久久麻豆 | 日本欧美一区二区三区乱码 | 日韩v午夜视频在线观看 | 99视频.com| 深夜在线视频免费网址 | 成人毛片18女人毛片免费看 | 91福利一区日本精品国产 | 十大高清影院软件排行榜 | 欧美精品高潮 | 亚洲国产av永久精品成人 | 91精品综合久久久久久五月天 | 不卡高清专区 | 凹凸国产熟女精 | 黄网站色视频大全免费看 | h无码动漫在线观看不卡 | 无码国内精品久久人妻 | 中文字幕免费在线 | 欧美三级成人网 | 97久久人人超碰国产精品 | 亚洲熟妇久久无码精品 | 欧美日日日 | 国产在线观看入口网站 | 亚洲av无码一 | 午夜在线欧美曰韩精品影 | 精品国产一区av天美传媒 | 国产精品成aⅴ人片在线观看 | 国产香港日本三级在线观看 | 国产视频一区二区 | 爆乳国产中文在线观看 | 欧美亚洲日韩国产一区二区三区 | 精品国产精品人妻久久无码五月天 | 亚洲国产精品无码久久98蜜桃 | 99久久成人精品免费 | 在线成人手机免费看片 | 国产又黄又大又粗的视频 | 精品久久久久久久中文字幕 | 成年18网站免费进入夜色 | 欧美日韩亚洲国产精品 | 成人久久久| 丰满人妻一区二区三区无码av | 激情内射亚州一区二区三区爱妻 | 久9视频这里只有精品手机版观看 | 日韩无码人妻精品视频 | 在线观看免费av无码不卡 | 麻豆av免费观看网站 | 精品少妇人妻av无码专区不卡 | av无码国产流畅 | 日韩一区国产二 | 91精品国产乱码在线观看 | 日本视频在线免费观看 | av毛片无码在线观看 | 国产一区二区三区四区观看 | 中文成人无码精品久久久 | 黄毛片网站免费在线观看 | 欧美激情在线日韩 | 色噜噜狠狠色综合av | 精品自拍视频在线观看电影 | 精品久久久久久亚洲综合 | 91视频免费观看 | 操美女视频 | 日韩人妻系列无码专区三级 | 91久久久无码国产精品免费 | 国产午夜福利白浆一区二区 | 黄视频下载 | 韩国高清一区二区午夜无码 | 91大神精品长腿在线观看网站 | 国产愉拍91九色国产愉拍热度飙升 | 国产精品欧美亚洲韩国日本久久 | 精品国产成人a区在线观看 精品国产成人t | 插我舔内射18免费视频 | 国产精品一区二区三 | 色综合久久一区二 | 国产av一区最新精品 | 国内免费 | 亚洲国产天堂久久综合网站 | 91麻豆精品国产91久久久久久 | 偷拍厕所美女尿尿视频 | 欧美日韩综合在线视频免费看 | 午夜成人亚洲理论片在线观看 | 狠狠色丁香婷婷综合尤物 | 成人免费无码大片a毛片抽搐色欲 | 国内精品伊人久久 | 欧美日一区二区 | 91精品国产综合久久久蜜臀粉嫩 | 四虎影视国产永久免费 | 亚洲国产精品一区二区色99 | 91无码麻豆人妻精品1国产软件 | 国产综合久久99久久 | 无码1卡2卡3卡4卡视频版 | 91精品人妻人人做人碰人人爽 | 国产精品网红尤物福利在线观看 | 国内精品久久久久久久97牛牛 | 国内精品人| 中文字幕亚洲男人的天堂网络 | 99久久精品免费观看区一 | 九九热精品免费观看 | 国产清纯白嫩美女正无套播放 | 无码精品人妻一区二区三 | 国产传媒在线观看 | 97制片厂爱豆传媒视频高清 | 国产亚洲综合精品一区二区三区 | 精品综合在线 | 69日本xxxxxxxxx19 69日本精品成人无码视频 | 亚洲av色区一区二区三区 | 蜜臀成人av一区二区三区四区 | 国产成人92精品午夜福利 | 亚洲精品无码永久在线观看 | 国产91精品不卡在线 | 99精品国产在热久久无毒 | 午夜精品久久影院蜜桃 | 九一电影院 | 在线视频福利 | 97色伦人人| 欧美午夜精品久久久久免费 | 成人a毛片免费观看网站 | 国产97视频人人做人人爱 | 精品国产无码av | 人人婷婷人人澡人人爽 | 国产午夜无码片在线观看网站 | 日韩av一区二区在线电影 | 欧美颜射内射中出口爆在线 | 欧美日韩亚洲人人夜夜澡 | 91免费无码国产在线观看i | 久久99国产综合精品1 | 日韩无码 | 91成人啪国产 | 国产老熟女精品一区免费观看全集 | 国产一级成av人片在线观看 | 国产日韩精品无码区免费专区国产 | 人妻插b视频一区二区三区 人妻潮喷失禁dh | 无码国产69精品久久久孕 | 91福利院 | 91精品夜夜夜一区二区 | 日韩精品一区二区三区免费视频 | 国产91在线播放九色000 | 日韩乱码人妻无码中文字幕久久 | 亚洲aⅴ一区二区三区四区 亚洲aⅴ永久无码天 | 国精产品秘福利姬在线观看 | 99久久国产精麻豆 | 国产一区视频观看 | 中文字幕av在线综合网 | 岛国视频在| 日韩欧美自在线观看亚洲精品福利片 | 亚洲成a人片在线播放器 | 日韩精品一区二区三区费暖暖 | 亚洲av无码乱码精品国产九色 | 国产精品视频免费一区二区三区 | 丰满岳乱 | 国产福利姬视频导航入口 | 精品一区二区三区的国产在线观 | a级国产乱理伦片 | 亚洲午夜精品aaa级久久久久 | 国产一级特黄大片在线观看 | 午夜成人性做爰a片无码潘金莲 | 免费无码中文a级毛片 | 91蜜桃国产 | 国产香蕉在线99 | 91在线无码一区二区 | 午夜精品久久久久久久99热蜜桃 | 亚洲国产精品线在线观看 | 午夜理论片yy6080私人影院 | 日韩欧美系列精 | 成人区人妻精 | 91探花在线 | 国产一区二区三区视频精品 | 综合色区亚洲熟妇另类 | 日本免费人成在线观看网站 | 日韩极品无码17p | 999国产视频网 | 91香蕉国产 | 国产娇小粉嫩在线观看 | 午夜无码影院在线 | 99久久人妻精品免费二区 | 国产精品自产拍在线观看免费 | 国产精品一级在线播放 | 麻豆成人91久久精品二区三区 | 亚洲精品香蕉视频播放 | 天美影视 | 喷水的视频一区二区三区 | 91精品国产免费久久国语蜜臀 | 91福利影院| 精品国产18久久久久久 | 韩国无码 | 亚洲蜜桃精久久久久久久久久久久 | 国产精品亚洲成在人线 | 性色av蜜臀av人妻无码 | 欧美性猛交xxxx富婆 | 亚洲aⅴ无码乱码在线播放 亚洲aⅴ无码码潮喷在线观看 | 欧洲美熟女乱又伦免费视频 | 99精品视频在线观看婷婷 | 麻豆精品国产自产在 | 日韩色情 | a级情欲片在线观看免费 | 亚洲国产精在线观看 | 国产高清色诱视频在线播放 | 国语精品91自产拍在线观看一区 | a级成人婬片免费看 | 日韩av一区二区精品不卡 | 欧美成人在线观看 | 国产午夜精品一区二区三区不卡 | 国产精品亚洲аv无码播放 国产精品亚洲成在人线 | 婷婷一区二区三区网站 | 亚洲mv大片免费网站 | avtt香蕉久久 | 亚洲av成人综合网 | 欧美一级乱理片免费观看 | 国产黄片35免费视频 | 日韩夜夜高潮夜夜爽无码 | 亚洲二区三 | 国产成人无码午夜视频在线 | 爆乳护士一区二区三区在线播放 | 亚洲无码免费在线小视频 | 国产乱子伦视频一区二区三区 | 精品欧美成 | 国产熟女高潮视频 | 一级特黄aaa大片在线观看 | 欧洲av无码一区二区三区 | 国产精品123 | 国产不卡高清视频在线观看 | 国产学生真实初次破初视频网站 | 亚洲精品一区二区在线 | 99久久精品一区二区毛片吞精 | 国产欧美综合在线观看 | 国产永久观看在线 | 亚洲乱色伦图片区小说 | 亚洲五月六月丁香激情综合 | 欧美一区二区三区精品不卡 | 国内在线 | 白丝爆浆18禁一区 | 午夜a级理论片左线播放 | 成人久久欧亚洲精品无码久久性 | 高潮喷水在线观看免费 | 天天躁夜 | 天堂网资源www | 国产一区二区三区福利 | 免费无码鲁丝片一区二区 | 精品国产免费久久无码 | 国产一级婬片a片aaa樱花 | 性色午夜婬片aaa播放 | 深夜在线视频免费网址 | 人妻精品久久无码区 | 精品久久久中文字幕二区 | 亚洲成在人线av壁咚影院 | 国产老妇女牲交视频 | 国产激情免费视频在线观看 | 国产自产一区二区三区视频在线 | 中文字幕日产乱码一区 | 国产成人7777在线观看 | 久久99热国产 | 在线无码午夜福利高潮视频 | 亚洲成色在线综 | 91久久国产成人免费网站 | 91精品高清在线观看免费 | 草b视频在线观看 | 欧洲一级一片在线观看免费精品色 | 国产无套白浆视频在线观看 | 无套内射在线无码播放 | www日韩欧美在线 | 国产高清自拍视频 | 欧美成人精品第一区首页 | 日韩精品熟女一区二区 | 日本永久精品视频在线观看 | 在线日本视频一区二区 | 亚洲国产日韩欧美久久精品 | 一级片免费在 | 欧美午夜激情久久久久久 | 人妻丰满熟妇av无码片 | 亚洲精品无码专区在线在线播放 | 国产一区二区在线播放 | 国产激情精 | 日韩av无码久久区二区三区 | 精品视频免费在线 | 亚洲av无码1区2区久久 | 国产成人v无码专区亚洲v | 怡红院成永久免费人全部视频 | 日本女优一区二区三区四区 | 自拍影视乱伦国产 | 久久大片91 | 欧美性色欧美 | av中文无码乱人伦 | 亚洲国产成人精 | 变态视频下载 | 最新国产麻豆aⅴ精品无码 最新国产一级a一片免费观看 | 91嫩草国产在线无码观看 | 欧美日韩三级电影在线观看 | 在线观看91精品国产网站 | 国产成人午夜福在线观看 | 91视频网址| 精品国产不卡在线观看免费 | 91九色在线播放 | 国产99| 人人澡人人澡人人看添av | 国产午夜无码福利在 | 91久久国产成人免费观 | 无码国产精成人午夜视频 | 精品无码国产一区二区三区麻豆 | 精品无码国产在线一区二区福利姬 | 日日做夜夜爽夜夜爽 | 九一制片厂果冻 | 欧美孕妇乳喷奶水在线观 | 人人妻人人澡欧美一区二区 | 成年免费a级毛片免费看 | 99精品免视看 | 国产高清乱码一区二区三区 | 国产aⅴ无码久久丝袜美腿 国产aⅴ无码专 | 日韩高清无码v | 国产成人a亚洲精v品无码 | 精品免费无码一区二区三区 | 亚洲av永久无码区成人网站 | av午夜午夜快憣免费软件 | 国产免费福利视频一区二区 | 精品国产91久久久久久久a | 国产精品亚洲成在人线 | 日本熟妇色 | 三区免费播放 | 成年女人免费毛片视频永久vip | 国产午夜福利100集发布 | 亚洲无码免费观看黄色 | 91成人影院| 国产一区二区三区免费视频 | 精品国产自线拍 | 性欧美高清视频在线观看 | 国产精品免费观看 | 亚洲av无码男人的天堂 | 亚洲成aⅴ人片在线观看无码 | 91视频国产亚洲精品 | 97亚洲欧| 精品国产一区二区三区不 | 丝瓜视频涩涩屋色多多色版成人 | 午夜影视 | 成人电影在线免费观看 | 国产av巨作情欲放纵无码 | 国产成人精品午夜福利 | 国产精品露脸国产对白 | 1区2区3区视频软件排行榜 | 日本人妻一二三区 | 亚洲成aⅴ人片久青草影院 亚洲成aⅴ人片在线观看www | 亚洲第一看片 | 天天操狠狠操 | 欧美久久一级内射wwwwww | 天天看片亚洲欧美国产 | 中文字幕av影视精品不卡 | 亚洲v欧美v日韩v国产v在线 | 国产成人av乱码在线观看 | 国产女人18毛片水真多18精品 | 少妇爆乳无码网站在线看 | 成年站免费网站看v片在线 成欧美亚洲人一区二区三区免费 | 99精品一区二区三区免费视频 | 国产99欧美精品久久精品 | 日韩超薄丝袜无码视频下载网站 | 91导航app| 国产一级久久久久久毛片 | 日本gv在线一区二区三区 | 欧美嫩交一区二区三区 | 91麻豆国产视频一级片 | 中日精品无码一本二本三本 | 无码不卡一区二区三区在线 | 国产巨作在线无遮挡 | 少妇av| 99婷婷综合国产 | 丰满人妻一区二区三区53视频 | 国产v亚洲v天堂a无码 | 精品三级在线国产 | 欧美性videosxxxxhd| 91大神在线 | 国产午夜亚洲精品国产 | 中文国产一区二区三区在线观看 | 激情婬妇动态视频无遮挡 | 国产精品无码mv在线观看 | 午夜色av大片在线观 | 99re热这里只| 精品国产乱子伦一 | 中日韩无码水多多影视 | 欧美激情一区二区三区高清视 | 国产精品视频一区 | 91国精产品秘 | 无码av在线a√av在线 | 国产成人精选在线不卡网站 | 国产果冻 | 日韩精品福利片午夜免费 | 国产精品亚洲第一区在线 | 国产精品视频一区国模私拍 | 成人乱码一区二区三区四区 | 三级片中文字幕在线无码 | 亚洲无码免费在线小视频 | 亚洲精品线在线观看 | 区二区久久国产 | 欧洲日产国码农村 | 无码人妻精品中文字幕免费东京热 | 国产香蕉97碰碰久久人人 | 国产美女爽到喷出水来视频 | 国产精品国语刺激对白在线观看 | 亚洲国产精品浪潮久久久av | 久久99久久久精品 | 九一影视 | 亚洲一区二区三区四区50p | 亚洲暴爽av人人爽日日碰 | 亚洲欧美高清精品ⅴ | 91青青青国产在观免费影视 | 国产精品毛片久久 | 欧美亚洲综| 91精品国产闺蜜国产在 | 国产精品无码专区在线观看 | 亚洲一区二区入口 | 97久久| 欧美一级黄色片免费看 | 亚洲成a∨人片在无码 | 国产成本 | 成人无码电影在线 | 97精品国产91久久久久久久 | 成人一区二区三区视频 | 日韩精品无码一区二区三区不卡 | 97人人爽人人爽人人一区二区 | 国产乱人伦真实精品视频 | 国产免费午夜福利757 | 欧美日韩成人综合网站 | 日韩欧美高清在线 | 91超碰在线观看 | 最新国产乱人伦偷精品免费网 | 亚洲精品aa片在线观看国产 | 女性喷水高潮在线观看 | a级毛片免费高清视频 | 99久久国产精品免费热麻豆 | 无码国产69精品久久久孕 | 亚洲风情亚aⅴ在线发布 | 国产亚洲精品综合在线 | 欧美精品黑 | 欧美成人一区二区三区在线观看 | 韩国午夜理伦 | 国产精品亚洲一 | 91人妻中文字幕在线精品 | 亚洲一区免费观看 | 成人区人妻精品一区二区不卡视频 | 欧美禁忌老少 | 91视频观看 | 娇小枯瘦日本xxxx | 97久久精品人人槡人妻人人玩 | 97人妻人人揉人人躁人人 | 丰满人妻跪| 麻豆国产av精选 | 99re精彩视频 | 亚洲性线免费观看视频成熟 | 精品国产成人在线 | 99麻豆久久久国产精品免费 | 欧美日韩成人综合网站 | 毛片在线播放网站 | 国产精品一级二级三级 | 国产亚洲高清在线精品99 | 99精品全国免费7观看视频 | 国产精品日韩精 | 国产h版大片在线 | 国产免费无码av片在线观看不 | 欧洲亜洲中文日韩色图 | 欧美高潮喷水 | 成人电影在线免费观看 | 麻豆国产午夜福利片在线观看 | 麻豆福利视频 | 日本a级精品一区二区三区 日本a片把舌头伸进 | 日韩人妻系列无码专 | 国产精品永久免费99久久 | 丰满人妻熟妇乱又伦精品视 | 中文字幕日韩视频在线观看 | 天堂网www最新版资源在线 | 国产亚洲系列第一页在线播放 | 日韩av无码专区免费 | 亚洲一区在线精品 | 色久悠悠色久在线观看 | 精品久久国产字幕高潮 | 人人妻人人澡人人爽欧美一区九九 | 日本三级免费电影一区二区三区 | 国产特级毛片aaaa | 性少妇无码 | 成人免费无码毛片 | 三级黄色网址 | 欧美精品一区二区三区在线观看 | 国产成a人亚洲精品无码樱花 | 久久99久久精品中文字幕 | 国产av天堂 | 国产福利小视频在线免费观看 | 91麻豆精品国产91久久久久久久久 | 亚洲精品分类在看在线观看 | 午夜精品久久久久久99热蜜桃 | 97无码超碰中文字幕 | 天天躁夜夜躁狠 | 精品国产综合区久久久久久 | 亚洲中文字幕无码av一区 | 91国内精品久久久久免费影院 | 91精品一区二区三区在线播放 | 无码国产色欲xxxx视频 | 成人特级毛片www免费版 | 国产微拍精品 | 中文字幕人妻一 | 91在线精品国产电影 | 亚洲免费人成视 | 丰满的瑜伽老师 | 国产亚洲色婷婷久久99精品91 | 91亚洲国产在人线播放午夜 | 果冻传媒精品推荐在线观看 | 亚洲精品乱 | 久久www免费人成看片老司机 | 国产无码专区精品 | 亚洲福利| 东京热日韩无码高清国产精品 | 精品精品国产自在久久精品 | 久草免费在线 | 国产在线精品一区二区夜色 | 国产精品视频免费播放 | 成年片色大黄全免费网 | 无码中文字幕人妻在线一区 | 精品日本在线免费观看 | 果冻国产精品麻豆成人av | 人前露出精品视频 | 欧美日韩在线免费一区二区三区 | 日韩在线视频在线观看 | 亚洲影视一区二区在线播放 | 最新天堂√最新版中文在线99 | 国产一级内射麻豆91 | 精品一区二区三区视频在线观看免 | 亚洲成av人片一区二区三区 | 九九热精品在线视频观看 | 日韩一区二区三区不卡免费毛片av | 91久久亚洲精品影院 | 国产精品三级在线观看 | 精品久久免费 | 毛片网站在线观看 | 国产女精品视 | 99精品久久毛片a片 99精品免费在线观看 | 午夜亚洲日本在线 | 果冻传媒携手京东天美麻豆 | 狠狠躁天天躁无码字幕 | 最新国内久久免费视频 | 亚洲欧美另类自拍第一页 | 亚洲欧美日本综合一区二区 | 婷婷综合久久一区二区三区 | 激情五月丁香婷婷 | 91福利视 | 欧美日韩国语aⅴ视频网站 欧美日韩激情视频一区二区三区 | 国产精品国产三级国产专播 | 日韩亚洲人成影院 | 无码中文字幕一二三区 | 日韩一区二 | 91免费国产自产地址入 | 亚洲欧美国 | 91手游网手机app免费版 | 国产美女裸体无遮掩免费牛牛 | 中文无码第3页不卡av | 国产黄片35免费视频 | 91精品啪在线观看国产色 | 亚洲无码原创 | 亚洲国产欧美不卡在线 | 国产女人久久香蕉精品视 | a成在线观看网站 | 国产精品99久久久久久四虎 | 亚洲精品天天影视综合网 | 国产精品va无码一区二区 | 国产性自爱拍偷在在线播放 | av片在线看 | 日本xxxx高清色视频在线播放 | 亚洲av人无码综合在线观看 | 国产精品1024在线永久 | 东京一区二区三区高清视频 | 精品无码大爆乳在线视频 | 亚洲欧美另类成人综合图片 | 国产成人精品亚洲 | 欧美一区| 亚洲最大av免费专区 | 人妻熟妇视频 | 无码久久精品国产 | 免费一级做a爰片久久毛片潮 | 在线观看av | 性做久久久久久久久男女 | 亚洲一卡一卡二新区乱码 | 日韩亚洲欧美高清一区二区久 | 久久99精品久久久久久无毒不卡 | 亚洲乱码av一区二区三区 | 午夜一区二区免费福利麻豆 | 国产原创在 | 偷窥亚洲综合20p | 日本一区二区精品理论电影 | 91版手游平台下载 | 在线观看av网站永久免费观看 | 日韩十八禁在线1区2区3区不卡 | 精品一区二区av天堂 | 最新中文字慕 | 无码av一区在线观看免费 | 亚洲av无码精品网站 | 亚洲成a人片在线观看高清 亚洲成a人片在线观看国产 | 超碰97人人做人人爱少妇 | 国产日产亚洲精品 | 少妇人妻在线 | 国产精品毛片一区二区 | 中文字幕久久久久一区 | 黑料不打烊吃瓜 | 国产精品无遮挡永久视频 | 欧洲国产日产综合综合 | 在线亚洲男人的天堂a∨ | 亚洲日韩在线中文字幕线路 | 色欲影视天天综合 | 国产欧美一区二区三区 | 精品av国产一区二区三区四区 | 亚洲乱强 | 无码专区3d动漫精品一区二区 | 国产精品成人在线播放 | 日韩一区二区在线 | 精品无码中出 | 91香蕉国产线观看免费茄子 | 少妇爆乳无码av无码专区 | 国产三级国产经典国产av | 国产精品粉嫩在 | 欧美中文综合在线观看 | 精品国产v一区二区三区 | 在线观看国产精品日韩av | 国产91精彩在线观看 | 国产成人麻豆精品午夜福利在 | 国产成人啪精品午 | 香蕉伊思人视频 | 国产av一区二区三区天堂综合网 | 国产亚洲av片天天在线观看人 | av无码精品一区二区三区四区 | 亚洲午夜理论片在线观看 | 中文字幕精品在线观看 | 国产午夜精品一区二区 | 无码熟妇人妻av在线影片最多 | 日本欧美一二三区色视频 | 国产精品国产三级国产αv 国产精品国产三级国产专i | 日本中文字幕在线播放 | 亚洲不卡中文字幕无码的影片 | 成人中文乱 | 国产亚洲一区在线观看一区二区 | 精品国产乱码久久久久 | 亚洲av永久无码精品网站色欲 | 成人免费无遮挡在线播放 | 国产精品va尤物在线观看性色 | 亚洲日韩一页精品发布 | 三级无码在线 | 91高清国产经典在线观看 | 成人免费a级毛片 | 无码精品亚洲日韩中文字幕 | 亚洲aⅴ自偷自拍视频 | 精品免费国产一区二区女 | 国产精品免费看久久久8 | 国产免费aⅴ大片在线观看 国产免费aⅴ片在线观看麻豆 | 精品人妻一区二区三区浪潮在线 | 国产午夜成人无码免费 | 欧美视频| 亚洲综合精品一区二区三区中文 | 国产成人av大片大片在线播放 | 中文字幕1区无码影片 | 无码国模产在线观 | 国产美女自慰在线观看 | 成人精品视频99 | 国产国产精品人在线观看 | 日本欧美一区二区三区不卡视频 | av网址最新观看在线 | 日韩精品高清一区二区三区 | 国产精品内 | 日本精品视频在线观看 | 国产欧美精品va在线播放 | 国产高清日韩一区二区四季 | 三年片在线观看免费观看大全 | 91短视频永久免费版app下载 | 成全漫画 | 国产精品无码av无码 | 国产高清亚洲 | 在线精品视频一区二区三四 | 久久93精品国产91久久综合 | 国内精品久久久久久久久久影视 | 97久久精品无码一区二区欧美人 | av永久天堂一区二区三区 | 91精品免费国产高清在线 | 超碰在线观看97青草国产 | 69国产超薄丝袜足j在线直播 | 免费无码av片在线观 | 91麻豆精品国产一区色欲噜噜噜 | 91亚洲精品福利在线播放 | 91亚洲视频在线观看 | 国产高潮视频在线观看 | 精品无码久久久久久尤物 | 日本精品一区二区三区视频 | 国产免费伦精品一区二区三区 | 欧洲熟妇性 | 无码专区无码专区www | 国产一区二区三区日韩欧美 | 无码人妻一区二区三区av | 欧美日韩精品一区二区在线视频 | 无套内谢少妇毛片a片打工皇帝 | 久久成人 | 国产精品人成在线二区 |