找不到 Parcel 类型的默认成员

No default member found for type Parcel

这是重复的,如下所述,但我认为我们需要保留它。在发布之前,我确实在搜索帮助时找到了重复项。对我来说,这里的解释比重复的解释更容易理解。

当我 运行 下面的代码时,我在它 运行 的 ParcelsRepeater.DataSource = Split.Parcels 命令之后得到错误 "No default member found for type Parcel"。错误消息似乎在 aspx 代码中突出显示 <%#Container.DataItem("PIN")%>。

它似乎从未命中 ItemDataBound 事件。

Imports System.Linq


Public Class SplitCreateParcels
Inherits System.Web.UI.Page

Public Class SplitParcel

    Public Sub New()
        Parcels = New List(Of Parcel)
    End Sub


    Public Property Parcels As List(Of Parcel)

End Class

Public Class Cat
    Public Property Category As String
End Class

Public Class Parcel

    Public Sub New()
        Categories = New List(Of Cat)
    End Sub
    Public Property PIN As String
    Public Property Categories As List(Of Cat)
End Class

Public Property _Split As SplitParcel


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim Split As New SplitParcel
    Dim Parcel1 As New Parcel
    Dim Parcel2 As New Parcel


    Split.Parcels.Add(Parcel1)
    Split.Parcels.Add(Parcel2)

    Parcel1.PIN = "Test1"
    Parcel1.Categories.Add(New Cat With {.Category = "1"})
    Parcel1.Categories.Add(New Cat With {.Category = "2"})

    Parcel2.PIN = "Test2"
    Parcel2.Categories.Add(New Cat With {.Category = "3"})
    Parcel2.Categories.Add(New Cat With {.Category = "4"})

    ParcelsRepeater.DataSource = Split.Parcels
    ParcelsRepeater.DataBind()


End Sub

Protected Sub ParcelsRepeater_ItemDataBound(sender As Object, e As RepeaterItemEventArgs)
    If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim ParentDataItem As Parcel = DirectCast(e.Item.DataItem, Parcel)


        Dim ChildRepeater As Repeater = DirectCast(e.Item.FindControl("IntegerRepeater"), Repeater)
        ChildRepeater.DataSource = ParentDataItem.Categories
        ChildRepeater.DataBind()



    End If
End Sub
End Class



<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="SplitCreateParcels.aspx.vb" Inherits="UADWeb.SplitCreateParcels" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <asp:Repeater ID="ParcelsRepeater" runat="server"  OnItemDataBound="ParcelsRepeater_ItemDataBound">
            <ItemTemplate>
                <%#Container.DataItem("PIN")%>
                <asp:Repeater runat="server" ID="IntegerRepeater">
                    <ItemTemplate>
                        <%#Container.DataItem("Category")%></br>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>

我相信你的问题是这一行:

<%#Container.DataItem("PIN")%>

这发生在 ParcelsRepeater_ItemDataBound 之前,因为它是作为数据绑定的一部分处理的。

如代码中所示,您需要将 DataItem 转换为正确的类型才能访问属性。以下应该有效:

<%#DirectCast(Container.DataItem, [Namespaced Path To your Type].Parcel).PIN%>

有必要提供您的 Parcel 类型的完整路径,因为在代码隐藏与标记中处理代码的方式不同。对于该语法的替代方法,您 can view this Q&A

作为一种不同的解决方案,您可以只向项目模板添加文字并在代码隐藏中填充它的文本:

<asp:Repeater ID="ParcelsRepeater" runat="server" 
  OnItemDataBound="ParcelsRepeater_ItemDataBound">
  <ItemTemplate>
    <asp:Literal Text="" ID="Pin" runat="server" /> 
    ...

然后 ParcelsRepeater_ItemDataBound

Dim ParentDataItem = DirectCast(e.Item.DataItem, Parcel)
Dim PinLiteral = DirectCast(e.Item.FindControl("Pin"), Literal)
PinLiteral.Text = ParentDataItem.PIN
...