【问题标题】:asp.net listview showing data from related entity and changing itasp.net listview 显示来自相关实体的数据并更改它
【发布时间】:2026-01-16 14:00:01
【问题描述】:

我正在使用实体框架。我的模型有实体 tblGameInfo,其中导航属性是名为 tblPlayer1 和 tblPlayer2 的关联,它们链接到实体 tblPlayer。我的页面上有列表视图,我想在其中显示带有玩家姓名的游戏信息。我发现在列表视图中我应该有例如其中之一:

                <td>
                    <asp:Label ID="tblPlayer1Label" runat="server" 
                        Text='<%# Eval("tblPlayer1.FirstName")%>' />
                </td>
                <td>
                    <asp:Label ID="tblPlayer2Label" runat="server" 
                        Text='<%# GetPlayerName(Eval("tblPlayer2.id")) %>' />
                </td>

但它不起作用。我没有在列表视图中显示任何内容。我尝试了许多不同的选项,但找不到有效的选项。可能是一些简单的错误,但我是 asp.net 的新手,找不到它。 第二个问题是编辑。在编辑模板中有所有玩家的下拉列表。

                <td>
                    <asp:DropDownList ID="DropDownList1" runat="server" 
                       DataTextField="FullName" 
                       DataValueField="id" 
                       SelectedValue='<%# Bind("tblPlayer2") %>'>  <- ??
                    </asp:DropDownList>
                </td>

如何进行数据绑定?不允许绑定和更改属性?它告诉我元素列表中不存在元素。

【问题讨论】:

    标签: asp.net entity-framework data-binding listview


    【解决方案1】:

    对你的问题1:

    我猜你正在使用 EntityDataSource 作为 ListView 的数据源,对吗?

    如果是这样,请尝试将以下属性添加到您的 EntityDataSource:

    Include="tblPlayer1, tblPlayer2"
    

    这会在 DataSource 执行查询时加载相关的实体。

    对于你的问题 2:

    了解您使用的是实体框架版本 4 还是版本 1,这一点很重要。如果您使用的是 EF4,是否在模型中包含外键。

    如果您包含外键,那么您的 tblGameInfo 实体中应该有像 tblPlayer1IDtblPlayer1ID 或类似的标量属性,它们代表基础数据库表中的外键列。在这种情况下,您的 DropDownList 中的 Bind("tblPlayer2ID") 应该可以工作。

    【讨论】:

    • 嗨,我有类似的问题,但我的数据源不是 EntityDataSource,而只是一个 linq 查询。如何访问关联表中的导航属性值?
    • ObjectQuery 有一个 Include 方法,其工作方式类似于 EntityDataSource 的 Include 属性:msdn.microsoft.com/en-us/library/bb738708.aspx。 (如果此链接不能更好地作为一个单独的问题提出您的问题以吸引更多读者。)
    【解决方案2】:

    尝试以下方法:

    Text='<%# GetPlayerName(((MyObjectType)Eval(("tblPlayer2")).id) %>' />
    

    那里可能有一个额外的 ) 不正确,但本质上是转换播放器 2 引用,然后获取它的 ID。

    此外,对于 EF,您必须先加载所有相关对象才能使用它们,因此请确保被绑定的对象已加载其导航属性。

    最后,对于drp down列表,你必须转换引用并引用播放器的ID,你可以从我更新的示例中获得。

    HTH。

    【讨论】:

    • 我想我需要更多的解释。我不能让它工作。如果我粘贴例如MyObjectType 的 tblPlayer(这是包含 id 的实体的名称)发生错误,即 tblPlayer 不存在。那我应该怎么投呢?对什么对象?如何检查绑定对象是否加载了导航属性?
    • 无论对象是什么类型;我不知道类名,所以我放了一个示例。所有导航属性,带有主实体的 Player1Reference 属性,都有一个 IsLoaded 属性和一个 Load() 方法,必须提前调用,或者在查询时需要使用 Include() 方法来包含关系。我知道这很痛苦,但不幸的是,这就是它想要的。
    最近更新 更多