對 ASP.NET 控制項的一點理解(整理)

來源:互聯網
上載者:User

Web 伺服器控制項和 Html 伺服器控制項

  一般地,在用 ASP.NET 開發 Web 應用程式時,時時刻刻都與控制項打交道,可以說是無處不在,其實 Web Form頁(.aspx 頁)也是控制項。

  ASP.NET 控制項分為 Web 伺服器控制項(簡稱 Web 控制項)和 Html 伺服器控制項(簡稱 Html 控制項),都是運行在伺服器端。兩者有什麼區別呢?

  我們平時用的 HTML 標籤,如 <a>、<input> 等,是無法用程式來控制它們的,需用其它如
JavaScript 等程式語言才能得以控制。在 ASP.NET 程式裡,我們可以在 HTML 標籤加上
runat="server",就可以將相應的 HTML 標籤變成 HTML 伺服器控制項,從而可以以編程的方式來控制這些 HTML 標籤。引用(http://www.dvbbs.net/tech/net/2006051268338.asp
):

  至於 Html 標註和 Html 控制項之間的區別很明顯,Html
控制項是運行於伺服器端,Html 標註是運行於用戶端。具體來說:當 ASP.NET 網頁執行時,會檢查標註有無 runat
屬性,如果標註沒有設定,那麼 Html 標註就會被視為字串,並被送到字串流等待送到用戶端,用戶端的瀏覽器會對其進行解釋;如果 Html
標註有設定 runat="server" 屬性,Page 對象會將該控制項放入控制器,伺服器端的代碼就能對其進行控制,等到控制執行完畢後再將
Html 控制項的執行結果轉換成 Html 標註,然後當成字串流發送到用戶端進行解釋。

  對於 Web 伺服器控制項,是 Web Form頁中用來定義 Web 應用程式使用者介面的組件,是 Web Forms 編程模型的基本元素,儘管 Web 伺服器控制項呈現為 HTML,但它們的物件模型不一定反映 HTML 文法。

  1、Asp.net 伺服器控制項提供更加統一的編程介面,如每個 Asp.net 伺服器控制項都有 Text 屬性。

  2、隱藏用戶端的不同,這樣程式員可以把更多的精力放在業務上,而不用去考慮用戶端的瀏覽器是 ie 還是 firefox,或者是行動裝置。

  3、Asp.net 伺服器控制項可以儲存狀態到 ViewState 裡,這樣頁面在從用戶端回傳到伺服器端或者從伺服器端下載到用戶端的過程中都可以儲存。

  4、事件處理模型不同,Html 標註和 Html 控制項的事件處理都是在用戶端的頁面上,而 Asp.net 伺服器控制項則是在伺服器上。

建立自訂伺服器控制項

  一、簡述:

  建立使用者控制項或伺服器控制項一般是繼承於 System.Web.UI.Control 類或
System.Web.UI.WebControls.WebControl 類。如 Web 使用者控制項(.ascx 頁)繼承於
System.Web.UI.UserControl 類,後者繼承於 System.Web.UI.TemplateContorl
類,後者又繼承於 System.Web.UI.Control 類,而 Web Form頁(.aspx 頁)也繼承於
System.Web.UI.TemplateContorl
類,為什麼中間要多出這些類呢?這些中間類都主要是提供一些共用的屬性、方法和事件,總不能把所有的功能都放在 Control
類吧。TemplateContorl 類為 Page 類和 UserControl 類提供一組準系統。而 Control 類為所有
ASP.NET 伺服器控制項提供共用的屬性、方法和事件,它作為開發自訂 ASP.NET
伺服器控制項時的派生源的主要類(為什麼要說“的主要類”是因為開發這些控制項時往往還要實現其它介面以完成更多功能)。咱們平時用得最多的
TextBox 控制項則是繼承於 System.Web.UI.WebControls.WebControl 類。後者同樣也是繼承於
System.Web.UI.Control 類。

  Control 沒有任何針對使用者介面 (UI) 的功能。如果要建立沒有 UI
的控制項或者組合其他呈現它們自己的 UI 的控制項,則從 Control 派生。如果要建立具有 UI 的控制項,則從 WebControl 或
System.Web.UI.WebControls 命名空間中的任何控制項派生,該命名空間為自訂控制項提供適當的起點。

  System.Web.UI.WebControls 命名空間包含一些呈現為 HTML
標記的類,如 TextBox 控制項和 ListBox 控制項。該命名空間還包含一些不在網頁上呈現、但支援資料操作的類,如
SqlDataSource 類和 ObjectDataSource 類。其他一些控制項(如 GridView 控制項和 DetailsView
控制項)支援資料顯示和編輯。WebControl 類用作 System.Web.UI.WebControls 命名空間中許多類的基類。

  二、例子:

  1. 一個 MSDN 的例子,建立一個從 Control 類繼承且無 UI 功能的控制項:

    // MyControl.cs
    using System;
    using System.Web.UI;

    namespace DemoControl
    {
        public class MyControl : System.Web.UI.Control
        {
            protected override void Render(HtmlTextWriter writer)
            {
                if (HasControls() && (Controls[0] is LiteralControl))
                {
                    writer.Write("<H2>Your Message : ");
                    Controls[0].RenderControl(writer);
                    writer.Write("</H2>");
                }
            }
        }
    }

    然後在 aspx 頁註冊該控制項並使用:

    // Test.aspx
    <%@ Page Language="C#" %>
    <%@ Register TagPrefix="UC" Namespace="DemoControl" Assembly="Demo" %>

    <UC:MyControl runat="server">
        <asp:Literal runat="server" Text="http://pcvc.net" />
    </UC:MyControl>

    運行結果:

    <H2>Your Message : </H2>
    http://pcvc.net

  2. 還是 MSDN 的例子:

    namespace SpanControl
    {
        using System;
        using System.Web.UI;
        using System.Web.UI.WebControls;
   
        // Renders the following HTML:
        // <span onclick="alert('Hello');" style="color:Red;">Custom Contents</span>
   
        public class MyWebControl : WebControl
        {
            public MyWebControl() : base(HtmlTextWriterTag.Span)
            { }

            [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
            protected override void AddAttributesToRender(HtmlTextWriter writer)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "alert('Hello');");
                writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
                writer.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "Pointer");
                base.AddAttributesToRender(writer);
            }

            [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
            protected override void RenderContents(HtmlTextWriter writer)
            {
                writer.Write("Custom Contents");
                base.RenderContents(writer);
            }
        }
    }

    在 aspx 頁註冊該控制項並使用:

    // spancontrol.aspx
    <%@ Page Language="C#" %>
    <%@ Register TagPrefix="UC" Namespace="SpanControl" Assembly="Demo" %>

    <UC:MyWebControl runat="server" />

    運行結果:

    <span onclick="alert('Hello');" style="color:Red;cursor:Pointer;">Custom Contents</span>

聯繫我們

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