您无需实现 IParserAccessor 即可获得您所说的功能。而是创建一个集合以在您的服务器控件中保存子控件(我们将其称为 Items),并将 ParseChildren 属性应用于您的服务器控件,并将“Items”作为 DefaultProperty 值。
以下链接包含有关如何实现 ParseChildren 的示例:
http://msdn.microsoft.com/en-us/library/aa310907(v=vs.71).aspx
更新
关于 IParserAccessor 的信息:
发件人:http://msdn.microsoft.com/en-us/library/system.web.ui.iparseraccessor.aspx
因为Control类实现了这个接口,所以比较容易
扩展该类并覆盖其实现
AddParsedSubObject 方法而不是自己实现这个接口。
来自:http://forums.asp.net/t/879797.aspx/1(见 imagemaker 的帖子):
AddParsedSubObject 是 IParserAccessor 的唯一方法
界面。 IParserAccessor 接口由 Control 和
从 Control 以及 ListItem 类继承的所有类。
当子控件或服务器控件的元素实现
IParserAccessor 接口是从 HTML 中解析出来的,
使用以下方法调用 AddParsedSubObject 方法
签名如下:
VB -- Sub AddParsedSubObject(ByVal obj As Object)
C# -- void AddParsedSubObject(object obj)
obj参数代表Object
已解析。在您的自定义服务器控件中被覆盖
AddParsedSubObject 方法,然后可以检查 obj 的类型
相应地对其进行转换和处理,例如作为文字控制或
作为特定的子元素,通过将其添加到子控件
集合,项目集合或其他任何东西。
这是来自同一篇文章的示例:
我第一次遇到实现 IParserAccessor 的地方
接口和 AddParsedSubObject 是在定义一个类
需要包含一个字符串作为其内部内容的子元素:
<WESNet:StyledList id="StyledList1" runat="server">
<WESNet:StyledItem Value="2" ForeColor="red">Two</WESNet:StyledItem>
<WESNet:StyledItem Value="5"
ForeColor="green">Five</WESNet:StyledItem></WESNet:StyledList>Because
我的 StyledItem 类没有从 Control 继承,我必须实现
IParserAccessor 及其 AddParsedSubObject 如下:
Protected Sub AddParsedSubObject(ByVal obj As Object) Implements IParserAccessor.AddParsedSubObject
If TypeOf obj Is LiteralControl Then
Me.Text = CType(obj, LiteralControl).Text
Else
Throw New ArgumentException("Inner content of StyledItem must contain only static text")
End If
End Sub
然后,在我的 StyledList 类(继承自 WebControl)中,我需要覆盖它的
AddParsedSubObject 方法如下:
Protected Overrides Sub AddParsedSubObject(ByVal obj As Object)
If TypeOf obj Is StyledItem Then
Dim si As StyledItem = CType(obj, StyledItem)
Items.Add(si)
Else
Throw New ArgumentException ("A StyledList server control may contain only StyledItems")
End If
End Sub
这里,在检查 obj 是 StyledItem 之后,将其添加到
控件的 Items 集合。