我正在创建一个购物车。用户将转到产品的各个页面,然后单击“添加到购物车”按钮。单击该按钮时,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>
答案 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。