ASP.NET組件設計簡介

來源:互聯網
上載者:User
ASP.NET組件設計Step by Step(1-3)

轉自CSDNBlog  之cashcho的專欄 

學習建立工程庫、在自己的項目中應用 

1、  啟動VS200X 

2、  選擇建立解決方案 

3、  選擇預設的方案類型,選擇 Web控制項陳列庫。Web控制項陳列庫不需要web網站,基本上是一個DLL類型庫 

4、  輸入自己的類型庫的名稱,譬如ASPCTLLib之類的。這個決定了namespace和以後其他工程使用此庫的引用庫名。 

5、  系統自動產生的代碼如下: 

using System; 

using System.Web.UI; 

using System.Web.UI.WebControls; 

using System.ComponentModel; 

  

namespace ASPCtlLib 

     /// <summary> 

     /// WebCustomControl1 的摘要說明。 

     /// </summary> 

     [DefaultProperty("Text"), 

          ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")] 

     public class WebCustomControl1 : System.Web.UI.WebControls.WebControl 

     { 

          private string text; 

          [Bindable(true), 

              Category("Appearance"), 

              DefaultValue("")] 

         public string Text 

         { 

              get 

              { 

                   return text; 

              } 

              set 

              { 

                   text = value; 

              } 

         } 

  

         /// <summary> 

         /// 將此控制項呈現給指定的輸出參數。 

         /// </summary> 

         /// <param name="output"> 要寫出到的 HTML 編寫器 </param> 

          protected override void Render(HtmlTextWriter output) 

         { 

              output.Write(Text); 

         } 

     } 

 

6、  AssemblyInfo.cs的介紹 

7、  編譯此工程得到ASPCTLLIb.dll 

8、  其他項目引用 

  

如何引用自己建立的Web控制項陳列庫 

1、  開啟/建立一個asp.net項目 

2、  引用ASPCTLLib.dll,將會在引用中出現aspctllib,同時將之前的dll檔案複製到當前工程的目錄 

3、  將自己的Web控制項陳列庫中控制項加入toolbar的選項卡:右擊選項卡,自訂工具箱,選擇.net架構組件,瀏覽,找到aspctllib.dll加入,即可看到名為WebCustomControl1的組件存在於工具箱 

4、  開啟自己的aps.net web 項目,選擇一個web表單,可以將自己的控制項加入到其中。預設的設計時此控制項會顯示:[WebCustomControl1 ” WebCustomControl1”]。 

5、  選中表單中的此控制項,開啟屬性進行編輯,基本上預設的設計控制項僅有一個Text屬性屬於定製屬性,輸入特定文字。 

-------------------------------------------------------------------------------
ASP.NET組件設計(2)  
從繼承關係上看,Asp.net 伺服器控制項的類別大致上分為4類: 

1、  使用者控制項 

類似page,基本上不需要編程,可以將某個aspx頁面作為複用組件使用。 

  

2、  LiteralControl 

ASP.NET 將所有不需要伺服器端處理的 HTML 元素和可讀文本編譯為該類的執行個體。例如,開始標記中不包含 runat="server" 屬性/值對的 HTML 元素被編譯為 LiteralControl 對象。 

文本控制項的行為與文本容納器一樣,這意味著可以從文本控制項提取文本,並通過父伺服器控制項的 Controls 屬性從父伺服器控制項的 ControlCollection 中移除文本控制項。因此,當開發從 LiteralControl 類匯出的自訂控制項時,確保由控制項自己執行任何所需的預先處理步驟,而不是使用對 LiteralControl.Render 方法調用的調用來實現它們。一般都會這樣做以提高 Web 應用程式的回應時間。 

LiteralControl一般不會觸發伺服器端事件。 

可以以編程方式分別使用 ControlCollection.Add 或 ControlCollection.Remove 方法,從頁或伺服器控制項添加或移除文本控制項。 

  

3、  HtmlControl 

HTML元素的asp.net模型伺服器端對應組件。每一個HtmlControl直接對應於特定的HTML元素(不一定是輸入元素)。 

4、  WebControl 

通常的Web控制項。可以理解為屬於複雜的HTML元素以及伺服器端處理邏輯組成的。 

  

繼承關係圖: 

System.Object 

   System.Web.UI.Control 

        System.Web.UI.TemplateControl 

               System.Web.UI.Page 

        System.Web.UI.UserControl 

        System.Web.UI.LiteralControl 

        System.Web.UI.HtmlControl 

        System.Web.UI.WebControl 

  

通常需要程式員開發的屬於使用者控制項、web控制項。xxx 

從WebControl繼承而來的web伺服器組件,往往繼承了豐富的UI元素和控制能力。 

  

使用者控制項 

1、  為什麼是使用者控制項 

現代人喜好偷懶,喜歡“所見即所得 (WYSIWYG)”以及“拖放”式的編程。在一個阿asp.net web項目中往往會在多個頁面中存在共用的UI,譬如header footer等,如果所有頁面的內容都一致,往往採用包含特定的js檔案來實現,但如果這些多個頁面都需要的UI部分跟隨不同的使用者狀態等不同而會不同,這是必須採用動態邏輯處理,普通的js/html就無法滿足要求。之前asp中採用include asp檔案來實現,現在asp.net改變了包含asp檔案的種種缺限而採用使用者控制項來解決。 

使用者控制項本質上是一個獨立的asp.net檔案,副檔名為ascx。使用者控制項通常依賴於特定的asp.net web項目。當使用使用者控制項時,asp.net頁面解析器從aspx檔案中動態產生一個類,將其編譯到一個特定的裝配件(臨時緩衝中託管dll),並按照.net方式引用此類執行個體,並進行處理。 

  

  

2、  如何得到使用者控制項 

得到使用者控制項,在vs中實際上僅需要: 

在web項目中添加—〉使用者控制項—〉輸入使用者控制項名—〉在得到的空白頁面進行UI設計,並儲存。 

使用時,將使用者控制項拖放在web 表單上,即可使用使用者控制項。此時vs替代我們做了一下工作: 

在使用使用者控制項的頁面添加一個register指令。具體為: 

<%@ Register TagPrefix="uc1" TagName="WebUserControl1" Src="WebUserControl1.ascx" %> 對於頁面解譯器可解釋為:將<uc1: WebUserControl1 作為使用者控制項來解釋,uc1為標籤首碼(類似標準web控制項的asp標籤首碼),WebUserControl1作為此使用者控制項的標籤,遇到這一組合就解釋為使用使用者控制項執行個體。Src值為該使用者控制項源檔案所在的虛擬路徑,但不可以為絕對路徑。 

  

3、  使用者控制項的實質(asp.net的使用者控制項的背景) 

asp.net是編譯的,處理使用者控制項同處理頁面是類似的,頁面中所有元素都是編譯成特定類被asp.net頁面類調用、觸發事件的。使用者控制項也是通過此途徑被複用的。當處理使用者控制項時,頁面架構執行以下步驟: 

解釋ascx檔案,相應解釋成為一個派生於System.Web.UI.UserControl的託管類 

動態編譯到自動產生的裝配件中。 

以上過程僅在第一次使用使用者控制項時發生,以後複用此使用者控制項會省略此步驟。頁面使用register指令,將會引用此類。頁面中的使用者控制項會成為此類的執行個體。實際上使用者控制項也是編寫asp.net類,派生於System.Web.UI.UserControl的類,頁面使用這些類如同使用ASP.net的標準類,為以不同在於標準控制項類內建可直接執行個體化使用,而使用者控制項需要在使用前進行類似頁面的編譯工作,編譯得到類並組裝到裝配件後可以被執行個體化。 

  

4、  使用者控制項編程注意事項 

使用者組件不可以通過new方式執行個體化,因為使用者控制項類屬於動態產生,new的時候(這個時候應當是頁面編譯時間候,使用者控制項還沒有被運行使用),使用者控制項類還不存在。但是可以通過Page.LoadControl(string controlname)來裝載,此時為了loadControl可以找到使用者控制項,需要採用refence指令:<%@ Refence Control=”xxx/UserControlSamples.ascx”%> 。 

使用者控制項可以被另外使用者控制項嵌套使用,但一定要確保使用者控制項引用位置正確。 

使用者控制項本身屬於UI,可以被緩衝,通過ascx檔案頂端的OutPutCache指令來確定。  
        使用者控制項代碼中到的URL是指使用者控制項存在的路徑,而不是調用使用者控制項的頁面代碼的路徑,需要通過Page.ResolveUrl進行正確的解析。 

-------------------------------------------------------------------------------------

ASP.NET組件設計(3) 

自訂控制項(custom control)入門 

在伺服器端中執行程式邏輯的組件,是asp.net 應用程式的基本構造塊。為了能夠在asp.net環境執行,必須滿足一定條件。 

        為了能夠參與到網頁架構執行,需要滿足IComponent, IDisposable, IParserAccessor,   IdataBindingsAccessor等介面。所以架構提供System.Web.Control類供控制項開發人員繼承。 

IComponent     提供組件所需的準系統,介面實現為: 

        { 

        ISite Site {get; set;}//提供網站介面,組件可以通過此介面訪問容器 

        event EventHandler Disposed;        //事件 

} 如果實現了此介面,就成為可設計組件,可加入到視覺化設計工具工具箱,能夠脫放到頁面(Isite介面)中,屬性瀏覽器中顯示內容。 

IDisposable  介面實現組件自身資源釋放(Icomponent實際上繼承自IDisposable  ) 

IParserAccessor 該介面規定AddParsedSubObject(object obj)方法用於通知伺服器控制項已分析元素(XML 或 HTML)。分析元素時,元素被識別為實現該介面的伺服器控制項的子級。這些元素將被轉換為對象。實現該介面時,所建立的控制項在被通知已分析元素後立即定義要發生的處理。 

IDataBindingsAccessor 介面允許在設計時訪問控制項的資料繫結運算式集合。 

       DataBindingCollection DataBindings {get;}// 指示控制項的所有資料繫結的集合。此屬性為唯讀。 

bool HasDataBindings {get;} //返回控制項是否包含任何資料繫結邏輯。 

  

       繼承自Control的WebControl類為表現HTML(畢竟最後使用者看到的是HTML)而在Control類中加入了一些新的功能,如樣式、字型、背景、前景。。。 

  

Control類的定義: 

       公用屬性: 

ClientID 擷取由 ASP.NET 產生的伺服器控制項標識符。  

Controls 擷取 ControlCollection 對象,該對象表示 UI 階層中指定伺服器控制項的子控制項。  

EnableViewState 擷取或設定一個值,該值指示伺服器控制項是否向發出請求的用戶端保持自己的檢視狀態以及它所包含的任何子控制項的檢視狀態。  

ID 擷取或設定分配給伺服器控制項的程式設計識別碼。  

NamingContainer 擷取對伺服器控制項的命名容器的引用,此引用建立唯一的命名空間,以區分具有相同 Control.ID 屬性值的伺服器控制項。  

Page 擷取對包含伺服器控制項的 Page 執行個體的引用。  

Parent 擷取對頁 UI 階層中伺服器控制項的父控制項的引用。  

Site 擷取有關伺服器控制項所屬 Web 網站的資訊(原文自MSDN,但是我認為不對,應該是指組件的“容器”網站,並非 web site)。  

TemplateSourceDirectory 擷取包含當前伺服器控制項的 Page 或 UserControl 的虛擬目錄。  

UniqueID 擷取伺服器控制項的唯一的、以分層形式限定的標識符。  

Visible 擷取或設定一個值,該值指示伺服器控制項是否作為 UI 呈現在頁上。 

  

公用方法 

DataBind 將資料來源綁定到被調用的伺服器控制項及其所有子控制項。  

Dispose 使伺服器控制項得以在從記憶體中釋放之前執行最後的清理操作。  

Equals(從 Object 繼承) 已重載。確定兩個 Object 執行個體是否相等。  

FindControl 已重載。在當前的命名容器中搜尋指定的伺服器控制項。  

GetHashCode(從 Object 繼承) 用作特定類型的雜湊函數,適合在雜湊演算法和資料結構(如雜湊表)中使用。  

GetType(從 Object 繼承) 擷取當前執行個體的 Type。  

HasControls 確定伺服器控制項是否包含任何子控制項。  

RenderControl 將伺服器控制項的內容輸出到所提供的 HtmlTextWriter 對象中;如果已啟用跟蹤功能,則儲存有關控制項的跟蹤資訊。  

ResolveUrl 根據傳遞給 TemplateSourceDirectory 屬性的值,將相對 URL 解析為絕對 URL。  

ToString(從 Object 繼承) 返回表示當前 Object 的 String。 

  

       公用事件 

DataBinding 當伺服器控制項綁定到資料來源時發生。  

Disposed 當從記憶體釋放伺服器控制項時發生,這是請求 ASP.NET 頁時伺服器控制項生存期的最後階段。  

Init 當伺服器控制項初始化時發生;初始化是控制項生存期的第一步。伺服器控制項應執行任何建立和設定執行個體所需的初始化步驟。在該事件內無法使用檢視狀態資訊;它尚未填充。在該事件的生存期內不應訪問其他伺服器控制項,不論它是此控制項的子級還是父級。不一定會建立其他伺服器控制項,也不一定能夠訪問它們。 

Load 當伺服器控制項載入到 Page 對象中時發生。通知伺服器控制項執行任何設定為在每次頁請求時發生的處理步驟。開發人員可以訪問檢視狀態資訊並利用該事件形成 POST 資料。還可以訪問頁控制項階層內的其他伺服器控制項。 

PreRender 當伺服器控制項將要呈現給其包含的 Page 對象時發生。使用該事件在伺服器控制項呈現給頁的輸出之前執行任何更新。在該事件的生存期內可以儲存伺服器控制項檢視狀態的任何更改。不儲存呈現階段內所做的同樣更改。 

Unload 當伺服器控制項從記憶體中卸載時發生。 

  

              受保護的屬性和方法有: 

              保護的屬性 

ChildControlsCreated 擷取一個值,該值指示是否已建立伺服器控制項的子控制項。  

Context 為當前 Web 請求擷取與伺服器控制項關聯的 HttpContext 對象。  

Events 擷取控制項的事件處理常式委託列表。此屬性為唯讀。  

HasChildViewState 擷取一個值,該值指示當前伺服器控制項的子控制項是否具有任何已儲存的檢視狀態設定。  

IsTrackingViewState 擷取一個值,該值指示伺服器控制項是否將更改儲存到其檢視狀態。  

ViewState 擷取狀態資訊的字典,這些資訊使您可以在同一頁的多個請求間儲存和還原伺服器控制項的檢視狀態。  

ViewStateIgnoresCase 擷取一個值,該值指示 StateBag 對象是否不區分大小寫。  

受保護的方法 

AddParsedSubObject 通知伺服器控制項某個元素(XML 或 HTML)已經過文法分析,並將該元素添加到伺服器控制項的 ControlCollection 對象。  

ClearChildViewState 刪除伺服器控制項的所有子控制項的檢視狀態資訊。  

CreateChildControls 通知使用基於合成的實現的伺服器控制項建立它們包含的任何子控制項,以便為回傳或呈現做準備。  

CreateControlCollection 建立一個新的 ControlCollection 對象來儲存伺服器控制項的子控制項(包括文本控制項和伺服器控制項)。  

EnsureChildControls 確定伺服器控制項是否包含子控制項。如果不包含,則建立子控制項。  

Finalize(從 Object 繼承) 已重寫。允許 Object 在“記憶體回收”回收 Object 之前嘗試釋放資源並執行其他清理操作。  

IsLiteralContent 確定伺服器控制項是否只包含文字內容。Asp.net頁面中普通的html標籤被asp.net編譯為一個 LiteralContent控制項(意味著輕型控制項)。 

LoadViewState 從 SaveViewState 方法儲存的上一個頁請求還原檢視狀態資訊。  

MapPathSecure 如果請求伺服器控制項有足夠的安全許可權讀取映射結果,檢索相對於源檔案的映射物理檔案路徑。  

MemberwiseClone(從 Object 繼承) 建立當前 Object 的淺表副本。  

OnBubbleEvent 確定伺服器控制項的事件是否沿頁的 UI 伺服器控制項階層向上傳遞。  

OnDataBinding 引發 DataBinding 事件。  

OnInit 引發 Init 事件。  

OnLoad 引發 Load 事件。  

OnPreRender 引發 PreRender 事件。  

OnUnload 引發 Unload 事件。 注意   在伺服器控制項生存期的此階段,伺服器控制項應執行所有最後的清理操作,例如關閉檔案、關閉資料庫連接和丟棄對象。  

RaiseBubbleEvent 將所有事件來源及其資訊分配給控制項的父級。  

Render 將伺服器控制項內容發送到提供的 HtmlTextWriter 對象,此對象編寫將在用戶端轉譯的內容。  

RenderChildren 將伺服器控制項子級的內容輸出到提供的 HtmlTextWriter 對象,此對象編寫將在用戶端轉譯的內容。  

SaveViewState 儲存自頁回傳到伺服器後發生的任何伺服器控制項檢視狀態更改。  

TrackViewState 導致Tracing Service器控制項的檢視狀態的更改,以便這些更改可以儲存到伺服器控制項的 StateBag 對象中。通過 Control.ViewState 屬性可訪問此對象。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.