asp.net2.0自定義服務器控件開發(一)

using System;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Samples.AspNet.CS.Controls
{
    [
    AspNetHostingPermission(SecurityAction.Demand,
        Level 
= AspNetHostingPermissionLevel.Minimal),
    AspNetHostingPermission(SecurityAction.InheritanceDemand,
        Level 
= AspNetHostingPermissionLevel.Minimal),
    
//默認屬性
    DefaultProperty("Text"),
    
//拖放到頁面上時,自動生成的頁面標記,{0}的值後面會提到
    ToolboxData("<{0}:WelcomeLabel runat="server"> </{0}:WelcomeLabel>")
    ]
    
//注意了這個控件派生於WebControl,且繼承了樣式相關的屬性,如 Font、ForeColor 和 BackColor
    public class WelcomeLabel : WebControl
    
{
        [
        Bindable(
true),
        
//把當前屬性顯示在屬性編輯器分類顯示時的外觀類別下面
        Category("Appearance"),
        
//默認值,應與getter一致
        DefaultValue(""),
        
//當在屬性編輯器中選中該屬性時,下方出現的描述文本
        Description("The welcome message text."),
        Localizable(
true)
        ]
        
public virtual string Text
        
{
            
get
            
{
                
string s = (string)ViewState["Text"];
                
return (s == null? String.Empty : s;
            }

            
set
            
{
                ViewState[
"Text"= value;
            }

        }

        
        
//繼承自 WebControl的自定義控件,重寫RenderContents方法
        protected override void RenderContents(HtmlTextWriter writer)
        
{
            writer.WriteEncodedText(Text);
            
if (Context != null)
            
{
                
string s = Context.User.Identity.Name;
                
if (s != null && s != String.Empty)
                
{
                    
string[] split = s.Split('/');
                    
int n = split.Length - 1;
                    
if (split[n] != String.Empty)
                    
{
                        writer.Write(
"");
                        writer.Write(split[n]);
                    }

                }

            }

            writer.Write(
"!");
        }

    }

}

 

繼承自System.Web.UI.WebControls.WebControl和System.Web.UI.Control 的區別:

如果控件要呈現用戶界面 (UI) 元素或任何其他客戶端可見的元素,則應從

System.Web.UI.WebControls.WebControl(或派生類)派生該控件。

如果控件要呈現在客戶端瀏覽器中不可見的元素(如隱藏元素或 meta 元素),

則應從 System.Web.UI.Control 派生該控件。

 

現在這個控件算是寫好,在編成.dll之前,肯定要測試一下,測試有兩種方法:

1.新建一個頁面,在這個頁面裏面首先註冊一下這個控件

<%@ Register TagPrefix="aspSample"  Namespace="Samples.AspNet.CS.Controls"%>

TagPrefix和Namespace表示aspSample這個標記是映射到Samples.AspNet.CS.Controls這個命名空間的

(和jsp的標籤是一個道理)

這種方式的缺點是要在每個頁面中都註冊一下,比較煩瑣

2.在web.config配置文件的<system.web>節點下加入

<pages>
   <controls>
       <add tagPrefix="aspSample" namespace="Samples.AspNet.CS.Controls"/>
   </controls>
</pages>

這種方式寫入配置文件以後,就不需要在每個頁面中進行註冊了

註冊完了以後

下面就可以在頁面中調用該控件進行測試了

在aspx文件中寫入

<aspSample:WelcomeLabel  ID="wel" runat="server" ForeColor =red></aspSample:WelcomeLabel>

進行調用

這個字符串不是隨便來的哦

還記得前面的ToolboxData("<{0}:WelcomeLabel runat=/"server/"> </{0}:WelcomeLabel>")嗎?

{0}就是在頁面裏註冊該控件時,定義的tagPrefix的值

測試無誤的話

就可以打開cmd,然後輸入

csc /t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll /r:System.Web.dll *.cs

把當前目錄下所有的cs文件創建了一個Samples.AspNet.CS.Controls.dll 程序集

/r:System.dll /r:System.Web.dll 表示鏈接到此程序集的那些程序集

如果要帶上圖標那就準備一個16*16的bmp圖片WelcomeLabel.bmp

csc /res:WelcomeLabel.bmp,Samples.AspNet.CS.Controls.WelcomeLabel.bmp
/t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll
/r:System.Web.dll *.cs

注意如果控件名稱爲 Samples.AspNet.CS.Controls.WelcomeLabel,則嵌入的位圖的名稱必須爲 Samples.AspNet.CS.Controls.WelcomeLabel.bmp

注意:可以選擇通過包含程序集級別的 System.Web.UI.TagPrefixAttribute 屬性,建議可視化設計器應爲控件使用的默認標記前綴。如果設計器未找到在 Web.config 文件或頁中的 Register 指令中映射的標記前綴,TagPrefixAttribute 屬性就會爲可視化設計器提供可以使用的標記前綴,因此該屬性非常有用。在工具箱中首次雙擊控件或將其從工具箱拖動到頁中時(後者貌似沒有自動註冊),此標記前綴將向頁進行註冊。

在源代碼目錄中創建一個名爲 AssemblyInfo.cs

using System;
using System.Web.UI;
[assembly: TagPrefix("Samples.AspNet.CS.Controls", "aspSample")]

重新編譯一下源文件。ok

至於怎麼用的話,就不說了

最後注意一點,在用的時候,雖然會自動在每個頁面註冊了,但是最方便的方法還是在web.config中配置一下

<pages>
   <controls>
       <add tagPrefix="aspSample"  
    namespace="Samples.AspNet.CS.Controls"
    assembly="Samples.AspNet.CS.Controls">
  </add>   </controls>
</pages>

assembly 屬性指定控件所在的程序集的名稱。addtagPrefix 元素將標記前綴映射到命名空間和程序集的組合。ASP.NET 從 App_Code 目錄中的源文件動態生成程序集時,無需提供程序集屬性。未使用程序集屬性時,ASP.NET 會從通過 App_Code 目錄動態生成的程序集加載控件的類型。

 

以上轉自msdn

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章