程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> Asp.net 3.5控件和組件開發技術系列—服務器控件屬性(二)

Asp.net 3.5控件和組件開發技術系列—服務器控件屬性(二)

編輯:關於ASP.NET

4.4.3.2  使用ControlBuilder解析 復雜內容

通過 System.Web.UI.ControlBuilder 類定制頁面解析邏輯,可以定制任意類型的標記,而不 像重寫AddParseSubObject 方法那樣限定子標記必須是子控件,且必須有前綴和runat 屬性,下面 直接通過一個例子來說明一下此類的用法。

首先建立兩個文件 ScriptItem.cs 和ScriptItemCollection.cs ,分別定義ScriptItem 類和 ScriptItemCollection 類。其中,ScriptItem 類主要存儲用戶自定義的客戶端腳本命令 (JavaScript 塊),ScriptItemCollection 可以定義一個集合容器,每個項都是一個ScriptItem 項。與前面講的集合實現非常類似。這兩個類的完整代碼如下:

1 .ScriptItem 類

/// <summary>
/// 獲得本書更多內容,請看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>

private string _Text;
[DefaultValue("")]
[Editor("System.ComponentModel.Design.MultilineStringEditor,System.Design", typeof (UITypeEditor))]
[PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)]
[NotifyParentProperty(true)]
/// <summary>
/// JavaScript腳本塊
/// </summary>
public string Text
{
   get
   {
     return _Text;
   }
   set
   {
     _Text = value;
   }
}

該類中的Text 就是用於存儲用戶定義的腳本塊;Editor 元數據特性指定在屬性窗口中Text 屬 性的編輯器是一個下拉塊輸入編輯器,關於屬性編輯器下一節會詳細講解,這裡僅知道它的功能即 可。

需要注意的是,在上一節使用AddParsedSubObject 實現頁面解析子控件時,要嵌套的三個集合 的子標記:ListItem ,ListItem2 ,ListItem3 都繼承了Control 基類,目的是把這些子標記作 為子控件(也就具有了前綴和runat 屬性),而這裡的ScriptItem 沒有繼承任何基類,這樣就避 免了繼承一些基類中的冗余屬性和方法。

2 .ScriptItemCollecton 類

/// <summary>
/// 獲得本書更多內容,請看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>

[ToolboxItem(false)]
public class ScriptItemCollection : List<ScriptItem>
{
   public ScriptItemCollection() : base() { }
   public ScriptItemCollection(int capacity) : base(capacity) { }
   public ScriptItemCollection(IEnumerable<ScriptItem> collection):base  (collection) { }
}

定義這兩個類之後,實現我們自己的ControlBuilder 類,可以直接繼承該類並實現自己的方法 ,已經預先實現好了的構造器類代碼如下所示:

/// <summary>
/// 獲得本書更多內容,請看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>

public class ScriptItemBuilder : ControlBuilder
{
   public override Type GetChildControlType(string tagName, IDictionary  attributes)
   {
     if (string.Compare(tagName.ToLower(), "scriptitem", false, CultureInfo.  InvariantCulture) == 0)
     {
       return typeof(ScriptItem);
     }
     return null;
   }
   public override bool AllowWhitespaceLiterals()
   {
     return false;
   }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved