【问题标题】:How to display data from two tables using EntityDataSources?如何使用 EntityDataSources 显示两个表中的数据?
【发布时间】:2012-08-18 13:06:43
【问题描述】:

我正在为一家销售电话号码的公司创建购物车。要购买电话号码,“客户”需要通过各种步骤来配置他们的电话号码。

  • 第一步:选择电话号码
  • 第二步:给这个号码添加通话套餐
  • 第三步:添加附加功能,例如语音邮件等...
  • 第四步:查看订单和结帐

到目前为止,我的方法是一个向导式的过程,我将客户选择存储在一个名为 NumberCart 的数据库中的表中。这存储了步骤一和二的所有信息。

第三步有点棘手,因为客户可以有许多与他们选择的号码相关的选项。为了尝试解决这个问题,我决定将他们的功能选择存储在一个名为 FeatureCart 的单独表中。

我一直在使用实体框架来检索和插入数据。可以通过剪切和粘贴此链接来查看数据模型(因为我是新手,Stackoverflow 只允许我发布两个链接)。

[armourcreative.co.uk/EntityDesignerDiagram.bmp]

我的问题是,有没有办法检索这两个表格并在网页中呈现结果,以便它像下面链接上的图像一样显示?

Example Cart Render of exactly what I want to achieve

我似乎只能得到两个 EntityDataSources 连接到同一页面上的 NumberFeatureView 和 NumberPackageView 呈现如下链接中的图像:

Example Cart Render of not what I'm looking for

正如您所见,显示用户选择的方式不是很清晰,因为它没有将功能与其所属的电话号码相关联。

我的想法是根据与 NumberPackageView 匹配的 CartID 和 NumberID 以某种方式显示 NumberFeatureView。

如果有人能告诉我如何完成上述操作,我将不胜感激。我可能离题了,这就是为什么我迫切需要帮助和指导。

修订

好的,我已经设法让他的购物车使用以下代码正确呈现:

    <h3>Please review your order!</h3>
<asp:ListView ID="NumberPackageView_LV" runat="server" 
    DataSourceID="NumberPackageView_EDM">

    <EmptyDataTemplate>
        No data was returned.
    </EmptyDataTemplate>


    <ItemTemplate>
        <li style="">
            <asp:HiddenField ID="ID" runat="server" Value='<%# Eval("NumberID") %>' />
            <strong><asp:Label ID="NumberLabel" runat="server" Text='<%# Eval("Number") %>' /></strong>&nbsp;&nbsp;&rarr;&nbsp;&nbsp;
            <asp:Label ID="DestinationLabel" runat="server" Text='<%# Eval("Destination") %>' />
            <br />
            <asp:Label ID="PkgNameLabel" runat="server" Text='<%# Eval("PkgName") %>' />&nbsp;&nbsp;&nbsp;&nbsp;
            <asp:Label ID="PkgMonthlyLabel" runat="server" Text='<%# string.Format("{0:c}",(Eval("PkgMonthly"))) %>' />


            <!-- ENTITY DATA SOURCE FOR FEATURES -->

<asp:ListView ID="NumberFeatureView_LV" runat="server" 
    DataSourceID="NumberFeatureView_EDM">
    <EmptyDataTemplate>
        No data was returned.
    </EmptyDataTemplate>
    <ItemTemplate>
        <li style="">
            <asp:Label ID="FeatureNameLabel" runat="server" Text='<%# Eval("FeatureName") %>' />
            <asp:Label ID="FeatureSetUpLabel" runat="server" Text='<%# string.Format("{0:c}", (Eval("FeatureSetUp"))) %>' />
            <asp:Label ID="FeatureMonthlyLabel" runat="server" Text='<%# string.Format("{0:c}", (Eval("FeatureMonthly"))) %>' />
        </li>
    </ItemTemplate>
    <LayoutTemplate>
        <ul ID="itemPlaceholderContainer" runat="server" style="">
            <li runat="server" id="itemPlaceholder" />
        </ul>
    </LayoutTemplate>
</asp:ListView>



<asp:EntityDataSource ID="NumberFeatureView_EDM" runat="server" 
    AutoGenerateWhereClause="True" ConnectionString="name=ShoppingCartv2Entities" 
    DefaultContainerName="ShoppingCartv2Entities" EnableFlattening="False" 
    EntitySetName="NumberFeatureViews" 
    Select="it.[FeatureName], it.[FeatureSetUp], it.[FeatureMonthly]" Where="">
    <WhereParameters>
        <asp:SessionParameter DefaultValue="0" Name="CartID" SessionField="ShoppingCartv2_CartId" />
    </WhereParameters>
</asp:EntityDataSource>

<!-- ENTITY DATA SOURCE FOR FEATURES [END] -->

 </li>
    </ItemTemplate>
    <LayoutTemplate>
        <ul ID="itemPlaceholderContainer" runat="server" style="">
            <li runat="server" id="itemPlaceholder" />
        </ul>
    </LayoutTemplate>
</asp:ListView>

<asp:EntityDataSource ID="NumberPackageView_EDM" runat="server" 
    AutoGenerateWhereClause="True" ConnectionString="name=ShoppingCartv2Entities" 
    DefaultContainerName="ShoppingCartv2Entities" EnableFlattening="False" 
    EntitySetName="NumberPackageViews" 
    Select="it.[NumberID], it.[Number], it.[Destination], it.[PkgName], it.[PkgMonthly]" Where="">
    <WhereParameters>
        <asp:SessionParameter DefaultValue="0" Name="CartID" SessionField="ShoppingCartv2_CartId" />
    </WhereParameters>
</asp:EntityDataSource>

我现在唯一的问题是,因为结果是在会话购物车上过滤的,所以它会重复存储在 FeatureCart 中每个数字下的所有功能,而不是显示针对该特定数字选择的功能。 (这仅在客户将多个电话号码添加到他们的购物车时才会发生)

例子:

0800 123 0001

  • 特色语音信箱
  • 功能通话录音
  • 特征环组

0800 123 0002

  • 特色语音信箱
  • 功能通话录音
  • 特征环组

代替

0800 123 0001

  • 特征环组

0800 123 0002

  • 特色语音信箱
  • 功能通话录音

谁能告诉我如何只显示针对相关数字选择的功能,而不是每个数字的相同选择(如果有意义的话?)

【问题讨论】:

    标签: c# asp.net sql-server entity-framework


    【解决方案1】:

    您可能想要尝试的一个选项是创建一个列表并将两个表中的行存储在该列表中,然后将该列表绑定到网格。例如:

    public class Main
    {
    
        public void BindData()
        {
            List<MyList> myResults = new List<MyList>();
    
            //Add rows from numbercart to list object
            foreach (var item in NumberCart)
            {
                myResults.Add(new MyList { Item = item.item, Price = item.price });
            }
    
            //Add rows from feature cart to list object
            foreach (var item in FeatureCart)
            {
                myResults.Add(new MyList { Item = item.item, Price = item.price });
            }
    
            //Bind to datagrid
            myDataGrid.DataSource = myResults;
    
        }
    }
    
    
    
    public class MyList
    {
        public string Item {get; set;}
        public float Price {get; set;}
    }
    

    【讨论】:

    • 您好 Jerry,感谢您抽出宝贵时间帮助我解决我的问题。我喜欢你的建议,但我对这一切都很陌生,以前从未使用过列表(我的学习曲线很陡!)。我已经在我的项目中实现了上述代码,但想知道您是否可以通过将 myResults 与 myDataGrid 绑定来阐明如何显示数据?从字面上看是给 GridView 一个 myDataGrid 的 ID 的情况吗?此外,我在这两行上得到以下错误:(NumberCart 中的 var 项)和(FeatureCart 中的 var 项)。两者都说(是“类型”,但用作“变量”),有什么想法吗?
    • 是的,我将创建一个名为 myDataGrid 的数据网格并将其设置为 DataSource = myResults。另外,我应该放“foreach(NumberPackageView_EDM 中的var item)”和“foreach(NumberFeatureView_EDM 中的var item)”。试试看。
    • 感谢 Jerry 提供的附加信息,但现在我已经实现了更改,但出现错误提示“foreach 语句无法对 'System.Web.UI.WebControls.EntityDataSource' 类型的变量进行操作,因为 ' System.Web.UI.WebControls.EntityDataSource' 不包含 'GetEnumerator' 的公共定义” - 对此有什么想法吗?非常感谢您的时间和精力!
    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 2020-06-15
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多