1

私はここで新しいですが、答えを探すときにしばらくの間stackoverflowを閲覧しています。

ここに問題があります:テンプレートでのテストをできるだけ避けるために、複数の条件付きテンプレートを使用してカスタムリピーターを実装しようとしています

今のところ私のascxコードはそのように見えます:

<custom:Repeater runat="server">
    <headerTemplate>...</headerTemplate>
    <templates>
    <custom:template match="[filter1]"><contents>[filter1] is true for <%# Container.DataItem.ID%></contents></custom:template>
    <custom:template match="[filter2]"><contents>[filter2] is true for <%# Container.DataItem.ID%></contents></custom:template>
    </templates>
</custom:Repeater>

この構文が冗長すぎることに加えて、次のコードは機能します

<custom:template match="[filter1]"><contents><%# TypeOf Container is IDataItemContainer%></contents></custom:template>

しかし、このコードは失敗します

<custom:template match="[filter1]"><contents>[filter1] is true for <%# Container.DataItem.ID%></contents></custom:template>

エラーメッセージが表示されます::'DataItem'は'System.Web.UI.Control'のメンバーではありません。vbは、データバインディングではなく、コンパイル時にテンプレートコンテンツを解析しようとしているようです。

これが私のvbクラスです

<ParseChildren(True, "contents")>
Public Class Template : Inherits WebControl : Implements ITemplate
    Private _match As String
    <PersistenceMode(PersistenceMode.Attribute)>
    Public Property match() As String
        Get
            Return _match
        End Get
        Set(ByVal value As String)
            'TODO compile filter as an expression
            _match = value
        End Set
    End Property

    Private _source As ITemplate
    <PersistenceMode(PersistenceMode.Attribute)>
    Public Property contents() As ITemplate
        Get
            Return Nothing
        End Get
        Set(ByVal value As ITemplate)
            _source = value
        End Set
    End Property

    Public Sub InstantiateIn(container As System.Web.UI.Control) Implements System.Web.UI.ITemplate.InstantiateIn
        _source.InstantiateIn(container)
    End Sub
End Class

<ParseChildren(True)>
Public Class ApplyTemplate : Inherits Repeater

    _template as List(Of Template)
    <PersistenceMode(PersistenceMode.InnerProperty), TemplateContainerAttribute(GetType(Template))>
    Public Overloads Property templates() As List(Of Template)
        Get
            Return Nothing
        End Get
        Set(value As List(Of Template))
            _templates = value
        End Set
    End Property

End Class

テンプレートのコンテンツにデータバインディング式を追加するにはどうすればよいですか?

前もって感謝します。

最大。

PS:ascxコードを次のように圧縮することは可能でしょうか(そしてどのように;)):

<custom:Repeater runat="server">
    <headerTemplate>...</headerTemplate>
    <custom:template match="[filter1]">[filter1] is true for <%# Container.DataItem.ID%></custom:template>
    <custom:template match="[filter2]">[filter2] is true for <%# Container.DataItem.ID%></custom:template>
    ...
</custom:Repeater>
4

1 に答える 1