无法在Web用户控件中向INamingContainer添加属性

时间:2012-09-16 09:33:19

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

我将(下方)的代码工作,除非我将ref="abc"添加到TemplateItem代码。如果包含它我会收到此错误:

  

属性'templateItem'没有名为'ref'的属性

如何解决此问题?

Default.aspx的

<%@ Register Src="~/message.ascx" TagName="Message" TagPrefix="uc" %>

<uc:Message ID="msg" runat="server" abc="123" >
    <TemplateItem ref="abc">Hi</TemplateItem>
</uc:Message>

message.ascx

<asp:placeholder runat="server" id="PlaceHolder1" />

message.ascx.vb

Partial Class message
Inherits System.Web.UI.UserControl

    Public Property abc() As String

    Sub Page_Init()
        If TemplateItem IsNot Nothing Then
            TemplateItem.InstantiateIn(PlaceHolder1)
        End If
    End Sub

    Private m_TemplateItem As ITemplate = Nothing

    <TemplateContainer(GetType(TemplateItem2))> _
    Public Property TemplateItem() As ITemplate
        Get
            Return m_TemplateItem
        End Get
        Set(ByVal value As ITemplate)
            m_TemplateItem = value
        End Set
    End Property

    Public Class TemplateItem2
        Inherits Control
        Implements INamingContainer

        Public Property ref() As String
    End Class

End Class

1 个答案:

答案 0 :(得分:0)

你确定它应该是:

Public Class TemplateItem2 

在底部,而不只是以下?:

Public Class TemplateItem

(如果你只是想要一个与该属性不同的名称,那么TemplateItemImplementationTemplateItemImpl之类的内容会更清楚吗?)

另外,我不确定这是如何工作的:

    TemplateItem.InstantiateIn(PlaceHolder1)

MSDN page on CompiledTemplate.InstantiateIn()说:此API支持.NET Framework基础结构,不能直接在您的代码中使用。我想这是一个旁注,我是假设你已经按照自己想要的方式工作......

我认为问题与该行TemplateItem的实例化有关;我看不出TemplateItem2(包含属性ref())与ITemplateItem的关系。也许您只需要让TemplateItem2同时实施ITemplateItem

如果可能的话,另一件事是让ref()成为ITemplateItem的属性。也许该接口成为<TemplateItem />的类型,这可以解释为什么它不包含属性Ref

(假设类型由属性TemplateItem()的返回类型指定)。