您的问题源于使用参数化属性(也就是使用字符串参数的属性)。参数化属性通常只有在它们是默认属性并公开某个对象的索引集合时才有意义。 (参见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"")")%>' />
...它没有解决。
您的解决方案有三个:
一个。评估为什么需要将此属性参数化。如果它传递了一个可以从集合中查找的键,这对我来说是有意义的。
b.不要使用 Eval 关键字,而是使用扩展语法并手动执行转换:
<asp:Label ID="lbl1" runat="server" Text='<%#CType(Container.DataItem, MyCustomClass).Item("a") %>' />
c。还要考虑如何将不同的密钥传递给中继器中的每条记录。如果接受整数索引,这可能是理想的,以便我们可以将其链接到转发器的行号。将上面的类修改如下:
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)")%>' />