Ваша проблема возникает из-за использования параметризованного свойства (которое также использует строковый параметр). Параметризованные свойства обычно имеют смысл только тогда, когда они являются свойствами по умолчанию и предоставляют индексированную коллекцию некоторого объекта. (См. C # indexers ) C # позволяет только параметризовать индексатор, пока VB более ослаблен этим ограничением.
Предполагается, что такой класс, как следующий:
Public Class TempClass
Private strItem As New StringDictionary()
Public Property Item(ByVal s As String) As String
Get
Return strItem(s)
End Get
Set(ByVal value As String)
strItem(s) = value
End Set
End Property
End Class
Для функции Eval требуется имя действительного открытого свойства. Когда вы используете параметризованное свойство, подпись отличается от того, что вы можете указать в функции Eval. Если вы используете следующий синтаксис:
<asp:Label ID="lbl1" runat="server" Text='<%#Eval("Item(""a"")")%>' />
... Не разрешается.
Ваше решение тройное:
а. Оцените, почему вам нужно параметризовать это свойство. Для меня будет иметь смысл, если ему передают ключ, который он может найти из коллекции.
б. Вместо использования ключевого слова Eval используйте расширенный синтаксис и выполните приведение вручную:
<asp:Label ID="lbl1" runat="server" Text='<%#CType(Container.DataItem, MyCustomClass).Item("a") %>' />
с. Также подумайте, как бы вы передавали разные ключи каждой записи в репитере. Это может быть идеально, если вместо этого принимается целочисленный индекс, чтобы мы могли связать его с номером строки повторителя. Модифицируем вышеуказанный класс следующим образом:
Public Class TempClass
Private strItems(3) As String
Public Sub New()
strItems(0) = "x"
strItems(1) = "y"
strItems(2) = "z"
End Sub
Public Property Items(ByVal i As Integer) As String
Get
Return strItems(i)
End Get
Set(ByVal value As String)
strItems(i) = value
End Set
End Property
End Class
Затем мы можем отобразить соответствующий элемент в массиве следующим образом:
<asp:Label ID="lbl1" runat="server" Text='<%#CType(Container.DataItem, TempClass).Items(Container.ItemIndex) %>' />
Отредактировано по запросу:
d) Класс, модифицированный для использования свойства по умолчанию:
Default Public Property Item(ByVal s As String) As String
Get
Return strItem(s)
End Get
Set(ByVal value As String)
strItem(s) = value
End Set
End Property
Привязка данных теперь становится:
<span><%#Eval("(a)")%></span>
<asp:Label ID="lbl2" runat="server" Text='<%#Eval("(b)")%>' />