我正在尝试在C#中编写一个模板自定义控件,ASP.NET将包含一组项目。我想使用它与ASP.NET中的内置DropDownList
控件类似,但我的项目将具有不同的属性。
我注意到用于表示ListItem
控件(或任何列表控件)中的项的DropDownList
类实现了IParserAccessor
接口。我什么时候应该实现这个界面,我应该在AddParsedSubObject(object obj)
中做些什么。我搜索过互联网,但我找不到一个例子或一个很好的解释。
我认为我的自定义控件的项目会在没有实现该界面的情况下实现,但仍然只是出于好奇,我很乐意了解它。
答案 0 :(得分:2)
您无需实施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用于定义a的类 需要包含字符串作为内部内容的子元素:
<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之后,它被添加到 控件的项目集合。