如何在自定义ASP.NET控件中使用IParserAccessor接口

时间:2011-07-27 13:14:36

标签: c# asp.net custom-controls

我正在尝试在C#中编写一个模板自定义控件,ASP.NET将包含一组项目。我想使用它与ASP.NET中的内置DropDownList控件类似,但我的项目将具有不同的属性。

我注意到用于表示ListItem控件(或任何列表控件)中的项的DropDownList类实现了IParserAccessor接口。我什么时候应该实现这个界面,我应该在AddParsedSubObject(object obj)中做些什么。我搜索过互联网,但我找不到一个例子或一个很好的解释。

我认为我的自定义控件的项目会在没有实现该界面的情况下实现,但仍然只是出于好奇,我很乐意了解它。

1 个答案:

答案 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之后,它被添加到   控件的项目集合。