使用实体模型将ArrayList绑定到Repeater控件

时间:2015-11-13 05:12:22

标签: c# asp.net arraylist session-variables repeater

我正在创建一个购物车。用户将转到产品的各个页面,然后单击“添加到购物车”按钮。单击该按钮时,ProductId将存储在Session [“Cart”]中的数组列表中。当他们转到Cart.aspx时,转发器将显示数组列表中的所有项目。我不确定如何正确使用实体模型的数组列表。

以下是代码隐藏

的内容
if (Session["Cart"] != null)
        {
            using (ProjectEntities myEntities = new ProjectEntities())
            {
                ArrayList alProduct = new ArrayList();
                alProduct = (ArrayList)Session["Cart"];

                var product = (from p in myEntities.Products
                               where p.ProductId == Convert.ToInt32(alProduct)
                               select new { p.ProductName });

                Repeater1.DataSource = product.ToList();
                Repeater1.DataBind();
            }
        }

以下是Cart.aspx的标记

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Repeater ID="Repeater1" runat="server">
        <ItemTemplate>
            <table>
                <tr>
                    <td>
                        <asp:Label ID="lblProductName" runat="server" Text='<%# Eval("ProductName") %>'></asp:Label>
                </tr>
            </table>
        </ItemTemplate>
    </asp:Repeater>
</asp:Content>

1 个答案:

答案 0 :(得分:0)

您的代码的首要问题在于:p.ProductId == Convert.ToInt32(alProduct)。由于alProduct是一个ArrayList,它永远不会转换为integer并且会抛出运行时异常。像这样更改您的查询并使用Contains: -

var product = (from p in myEntities.Products
               where alProduct.Contains(p.ProductId)
               select p.ProductName).ToList();

由于您只选择一个项目,即ProductName,因此无需投射匿名类型。

此外,在从session中分配值之前,不需要实例化ArrayList,尽管在运行product查询之前应检查null。我建议你使用通用版本的ArrayList,即List<int>而不是ArrayList。