2

在过去的几天里,我浏览了数百个谷歌结果页面,试图找到答案。

使用独立的动态数据页面显示表,使用 EntityDataSource,其中一个字段是子表的外键。我希望它显示子表中的值。我一直在玩一个使用 NorthWinds 数据库的简化案例(见下面的代码)。如果我为 DynamicControl 分配一个 DataField="Supplier",它会改为显示子表/类名称 ("DAL.Supplier")。如果我尝试分配 DataField="Supplier.CompanyName",则会出现“表 'Product' 没有名为 'Supplier.CompanyName' 的列”的错误。因为我想利用动态数据的编辑功能,所以使用带有 <%# Eval("Supplier.CompanyName") %> 的模板化字段已经过时了。

这对于独立的动态数据页面是不可能的吗?它在一个完全脚手架的系统中显然可以正常工作。还是我(希望)只是错过了什么?谢谢你。

测试.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Master/Site.master" AutoEventWireup="false" CodeFile="Test.aspx.vb" Inherits="Test" %>
<asp:Content ID="Content3" ContentPlaceHolderID="BodyContent" Runat="Server">

<asp:ListView ID="ListView1" runat="server" DataSourceID="theDataSource" DataKeyNames="ProductID">
    <ItemTemplate>
        <tr>
            <td>
                <asp:DynamicControl runat="server" DataField="ProductID" Mode="Edit" />
            </td>
            <td>
                <asp:DynamicControl runat="server" DataField="ProductName" Mode="Edit" />
            </td>
            <td>
                <asp:DynamicControl runat="server" DataField="Supplier" Mode="Edit" />
            </td>
            <td>
                <asp:DynamicControl runat="server" DataField="UnitPrice" Mode="Edit" />
            </td>
            <td>
                <asp:DynamicControl runat="server" DataField="Discontinued" Mode="Edit" />
            </td>
        </tr>
    </ItemTemplate>
    <LayoutTemplate>
        <table runat="server">
            <tr runat="server">
                <td runat="server">
                    <table id="itemPlaceholderContainer" runat="server" border="0">
                        <tr runat="server">
                            <th runat="server">
                                ProductID
                            </th>
                            <th runat="server">
                                ProductName
                            </th>
                            <th runat="server">
                                Supplier
                            </th>
                            <th runat="server">
                                UnitPrice
                            </th>
                            <th runat="server">
                                Discontinued
                            </th>
                        </tr>
                        <tr id="itemPlaceholder" runat="server">
                        </tr>
                    </table>
                </td>
            </tr>
            <tr runat="server">
                <td runat="server">
                </td>
            </tr>
        </table>
    </LayoutTemplate>
</asp:ListView>

<asp:EntityDataSource ID="theDataSource" runat="server" 
        ConnectionString="name=NorthwindEntities" 
        DefaultContainerName="NorthwindEntities" EnableDelete="True" 
        EnableFlattening="False" EnableInsert="True" EnableUpdate="True" 
        Include="Supplier"
        EntitySetName="Products">
    </asp:EntityDataSource>
</asp:Content>

测试.aspx.vb

Imports System.Web.DynamicData
Imports DAL

Partial Class Test
Inherits System.Web.UI.Page

Protected table As MetaTable

Protected Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
    Listview1.EnableDynamicData(GetType(Product))
    table = theDataSource.GetTable()
    Title = table.DisplayName   
End Sub
End Class
4

2 回答 2

1

问题解决了。当所有这一切开始时,我最初收到了错误消息:

无法确定 MetaTable。无法为数据源“EntityDataSource1”确定 MetaTable,也无法从请求 URL 中推断出 MetaTable。确保表映射到数据源,或者数据源配置了有效的上下文类型和表名,或者请求是注册的 DynamicDataRoute 的一部分

试图追踪它导致我摆脱了 asp:DynamicDataManager 标记,并在代码隐藏中将其替换为:

Listview1.EnableDynamicData(GetType(Product))
table = theDataSource.GetTable()

事实证明,这让我陷入了众所周知的兔子洞......虽然它摆脱了 MetaTable 错误,但它无意中导致了我在上面写的问题。非常感谢:http ://daviworld.net/?tag=/DynamicDataManager指出此错误消息实际上是由以下原因引起的:

这是由于 Designer 代码生成问题。当您为 GridView 控件选择数据源时,它不会将 ContextTypeName 属性添加到 EntityDataSourceControl。

一旦我删除了上面的代码行,并在 asp:DynamicDataManager 中重新添加到标记中,然后将 ContextTypeName="DAL.NorthwindEntities" 添加到 EntitiyDataSource,现在一切都可以正常工作了。

于 2012-04-26T14:10:48.283 回答
0

是的,你说的是真的。我在你被卡住的同一个地方。我从柱子跑到柱子,肚子里着火,但我想它可能很快就会熄灭。

怎么会搞砸到你不能在脚手架机制之外工作,你真正做的就是借用一个动态数据管理器,这样你就可以在他们的框架和你新添加的框架中保持模板化。

我进入这个洞的方式是当我尝试在同一页面上显示多个实体数据时。规则的拇指似乎是单个实体,单个页面。不管我现在有什么错误。在我再次打开瓶子之前再给它几天……让啤酒来吧!

于 2013-01-14T23:03:01.300 回答