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