ASP.NET自定义控件 - 允许文字内容的模板

时间:2010-06-16 18:09:00

标签: asp.net vb.net user-controls

我希望我的用户控件能够在其中包含文字内容。例如:

<fc:Text runat="server">Please enter your login information:</fc:Text>

目前我的用户控件的代码是:

<ParseChildren(True, "Content")> _
Partial Public Class ctrFormText
    Inherits UserControl

    Private _content As ArrayList

    <PersistenceMode(PersistenceMode.InnerDefaultProperty), _
    DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
    TemplateInstance(TemplateInstance.Single)> _
    Public Property Content() As ArrayList
        Get
            If _content Is Nothing Then
                Return New ArrayList
            End If
            Return _content
        End Get
        Set(ByVal value As ArrayList)
            _content = value
        End Set
    End Property

    Protected Overrides Sub CreateChildControls()
        If _content IsNot Nothing Then
            ctrChildren.Controls.Clear()
            For Each i As Control In _content
                ctrChildren.Controls.Add(i)
            Next
        End If
        MyBase.CreateChildControls()
    End Sub
End Class

当我将文本放入此控件(如上所示)时,我收到此错误:

Parser Error Message: Literal content ('Please enter your login information to access CKMS:') is not allowed within a 'System.Collections.ArrayList'.

此控件可能包含除文本之外的其他内容,因此将Content属性设置为属性将无法解决我的问题。

我在某些地方发现我需要实现一个ControlBuilder类,以及另一个实现IParserAccessor的类。

无论如何,我只希望我的默认“内容”属性允许其中包含所有类型的控件,包括文字控件和实际控件。

1 个答案:

答案 0 :(得分:0)

您需要将ParseChildren属性设置为“False”,否则控件中的任何内容都将被解析为“Content”属性。这不符合您的需求,因为您希望拥有控件和内容。

要完成此操作,请覆盖AddParsedSubObject方法。检查解析的控件类型,如果它是文字控件,则将其添加到UserControl的Content属性中。如果是其他控件,只需像往常一样将其添加到Controls集合中。

在解析所有子对象的最后,只需在文字控件或面板或其他内容中显示Content属性。