ASP.NET伺服器控制項開發(1)封裝html_實用技巧

來源:互聯網
上載者:User

在我們的項目開發中,由於ASP.NET的伺服器控制項功能有限,所以我們經常會自己定義特定的伺服器控制項,來滿足開發中特定的業務要求。可見知道如何開發ASP.NET伺服器控制項是非常有必要的。

其實簡單的實現ASP.NET伺服器控制項不是很難,以前園子中也有大牛介紹過相應的內容,這裡站在巨人的肩膀上也來分享下開發ASP.NET伺服器控制項的方法和自己的一些體會。寫給新手,高手繞過。

學習ASP.NET的伺服器控制項開發,個人認為最好的方式就是自己去實踐,當然理論知識也是很重要的,但是如果我們只是看理論的知識,可能會被裡面的一些概念鬧糊塗,看著看著就睡著了,如果自己動手創做出一個自己的控制項,效果就不一樣了。

下面就通過執行個體建立一個簡單的伺服器控制項:

首先我們建立一個類庫工程SelfWebControl。在同一解決方案中我們在建立一個ASP,NET Web應用程式(用來測試我們得控制項)

namespace SelfWebControl{  public class ControlA:Control//Control類中定義了所有ASP.NET伺服器控制項共用的屬性和方法  {  }}

我將ControlA類繼承Control類,Control類是.NET中所有控制項的基類,其中包含了控制項共有的屬性和方法。

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 屬性可訪問此對象。


這裡我們要重寫Render方法,通過HtmlTextWriter 對象將控制項中的內容顯示出去。

namespace SelfWebControl{  public class ControlA:Control//Control類中定義了所有ASP.NET伺服器控制項共用的屬性和方法  {    protected override void Render(HtmlTextWriter writer)    {      writer.Write("<table style='width:300px; height:200px; background-color:Bisque'>");      writer.Write("<tr>");      writer.Write("<td>這是第一列</td>");      writer.Write("<td>這是第二列</td>");      writer.Write("<td>這是第三列</td>");      writer.Write("</tr>");      writer.Write("</table>");    }  }}

產生我們得SelfWebControl工程,再切換到ASP.NET應用程式的工具箱時,VS2008會自動的將我們剛剛建立的ControlA添加到工具箱中,避免了我們以前通過選擇項添加控制項的過程。

這樣,我們就已最簡單的形式實現了一個ASP.NET伺服器控制項。但是如果我想修改表格的寬度,高度,背景色該怎麼改呢?

這就需要我們定義伺服器控制項的屬性。大家也都知道,ASP.NET的伺服器控制項有很多屬性,而我們現在的控制項只有公有的幾個屬性。

先來看看我們做了那些改動:

public class ControlA:Control//Control類中定義了所有ASP.NET伺服器控制項共用的屬性和方法  {    private int _tWidth;    private int _tHeight;    private string _bgColor;        [Browsable(true)]//在屬性視窗中是否可見    [Category("Appearance")]//屬性的分類,如,行為,外觀,大家可以在屬性視窗看見這樣的分類    [DefaultValue(100)]//屬性的預設值    [Description("表格寬度")]//這些是顯示在屬性視窗底下的    public int tWidth    {      get { return _tWidth; }      set { _tWidth = value; }    }    [Browsable(true)]    [Category("Appearance")]    [DefaultValue(100)]    [Description("表格高度")]    public int tHeight    {      get { return _tHeight; }      set { _tHeight = value; }    }    [Browsable(true)]    [Category("Appearance")]    [DefaultValue("Bisque")]    [Description("表格背景顏色")]    public string bgColor    {      get { return _bgColor; }      set { _bgColor = value; }    }    protected override void Render(HtmlTextWriter writer)    {      writer.Write("<table style='width:" + tWidth + "px; height:"+tHeight+"px; background-color:"+bgColor+"'>");      writer.Write("<tr>");      writer.Write("<td>這是第一列</td>");      writer.Write("<td>這是第二列</td>");      writer.Write("<td>這是第三列</td>");      writer.Write("</tr>");      writer.Write("</table>");    }  }

代碼很簡單,想必大家都能看懂,值得注意的就是對每一個屬性的聲明。需要引用命名空間:using System.ComponentModel;每一個標籤的作用我已經在代碼中做了說明,這樣我們就為我們得控制項添加了屬性.

還要說明一點的就是,如果我們想在把控制項拖到頁面中時標籤內自動的添加一些屬性,需要添加下面的代碼:

複製代碼 代碼如下:

[ToolboxData("<{0}:ControlA runat='server' bgColor='red' tHeight='200' tWidth='300'></{0}:ControlA>")]

值得注意的是這裡的寫法,{0}的冒號中之後的那個"ControlA“就是類的名字,不要寫錯。還有runat='sever'一定要寫。

是不是很簡單,這樣,我們只是封裝了簡單的html來完成ASP.NET控制項的製作。

小結:簡單的製作一個ASP.NET的伺服器控制項很簡單,但是光只是通過html的輸出有的時候意義不大,這裡只是介紹一種方法和思路。開啟學習定製自己的ASP.NET控制項的第一扇門。在以後的文章中我會介紹針對於繼承WebControl開發ASP.NET控制項。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.