首先看段代碼
[PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty),
NotifyParentProperty(true)]
public string Text
{
get { return _text; }
set { _text = value; }
}
[NotifyParentProperty(true)]
public string Value
{
get { return _value; }
set { _value = value; }
}
會發現Value屬性,並沒有標誌PersistenceMode屬性,那麼它的預設屬性就是PersistenceMode.Attribute. 由於我們設定了Text為預設屬性,所以當我們將Value也設定為InnerDefaultProperty的時候,Value的值沒被呈現。原因是我們:
[ParseChildren(true,"Text")]
public class MyItem
標記了MyItem類為預設屬性.
[ParseChildren(true, "Items")]
[ControlBuilder(typeof(ScriptItemBuilder))]
public class MyItemsControl : WebControl, INamingContainer
{
private MyItems _items;
[PersistenceMode(PersistenceMode.InnerDefaultProperty),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
]
public MyItems Items
{
get
{
if (_items == null)
{
_items = new MyItems();
} return _items;
}
}
這裡我自訂了ControlBuilder來編輯Items集合。它可以解析並返回任意的類型,而我們前面提到的AddParsedSubObject只能解析標記有runat='Server'的控制項。
而ControlBuilder可以解析任意標籤。
public class MyItemerBuilder : ControlBuilder
{
public override Type GetChildControlType(string tagName, IDictionary attribs)
{
if (string.Compare(tagName.ToLower(), "MyItem", false, CultureInfo.InstalledUICulture) == 0)
{
return typeof(MyItem);
}
return null;
}
}
DownLoad