控制元件開發學習筆記(一)——ToolboxData含義

鴨脖發表於2013-12-16

新建一個ASP.NET伺服器控制元件專案,Visual Studio自動產生如下的程式碼:

namespace WebControlLibrary
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:HelloWorld runat=server></{0}:HelloWorld>")]
    public class HelloWorld : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? "[" + this.ID + "]" : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}

剛開始接觸ASP.NET控制元件和元件開發,第1個疑問就是DefaultProperty 、ToolBoxData分別是什麼含義?

[DefaultProperty("Text")]
[ToolboxData("<{0}:HelloWorld runat=server></{0}:HelloWorld>")]

DefaultProperty是設定控制元件預設的屬性的。

ToolBoxData的意思是當你將這個控制元件從工具箱中拖放到WebForm中時在aspx檔案的HTML程式碼中新增的對該控制元件的定義。

這裡面的{0}表示什麼意思?

控制元件的標記的字首
就是你拖這個控制元件到頁面上時候
他就自動新增<{0}:HelloWorld runat=server></{0}:HelloWorld>,這個{0}是你定義的。

那究竟{0}如何定義呢?

修改Visual Studio自動產生的程式碼,增加下面的一行

[assembly: TagPrefix("WebControlLibrary", "aspNet")]
namespace WebControlLibrary

{

     //其他程式碼不變

}

重新生成控制元件專案。

新建網站,把新生成的控制元件拖到新建的Web窗體上,切換到源檢視狀態,可以看到控制元件定義標記為:

<aspNet:HelloWorld ID="HelloWorld1" runat="server" />

其中的aspNet正是我們用[assembly: TagPrefix("WebControlLibrary", "aspNet")]定義的。

同時,在頁面上部可以看到如下的標記:

<%@ Register assembly="WebControlLibrary" namespace="WebControlLibrary" tagprefix="aspNet" %>

再查一下msdn,TagPrefixAttribute的基本使用:

public TagPrefixAttribute(
string namespaceName,
string tagPrefix
)

當然,自定義ASP.NET伺服器控制元件TagPrefix,也可以修改網站的Web.config檔案:

   <controls>
    <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="WebControlLibrary" namespace="WebControlLibrary" tagPrefix="AspNet"/>
   </controls>

這樣,拖動控制元件到頁面上時,控制元件的tagPrefix為AspNet:

<AspNet:HelloWorld ID="HelloWorld1" runat="server" />

揀盡寒枝不肯棲,寂寞沙洲。

相關文章