【问题标题】:How should the IParserAccessor interface be used in custom ASP.NET controls在自定义 ASP.NET 控件中应该如何使用 IParserAccessor 接口
【发布时间】:2011-07-27 13:14:36
【问题描述】:

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

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

我假设我的自定义控件的项目可以在不实现该接口的情况下实现,但出于好奇,我仍然很乐意了解更多信息。

【问题讨论】:

    标签: c# asp.net custom-controls


    【解决方案1】:

    您无需实现 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 集合。

    【讨论】:

    • 感谢您的回复。尽管如此,我还是很高兴了解更多关于IParserAccessor 接口的信息,最好举一个它的用法示例——正如我主要出于好奇而说的。我想这与子解析有关 - 可能允许每个子提供自定义解析逻辑,但我找不到任何使用它的好例子。目前ParseChildren 属性应该可以满足我的需要。
    • 感谢您的努力,这正是我正在寻找的信息。
    猜你喜欢
    • 2011-02-10
    • 2013-11-28
    • 2012-04-28
    • 2010-10-10
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多