【发布时间】:2015-10-24 06:29:47
【问题描述】:
好的,我猜这是瘦的。我有一个小型购物车 Web 应用程序,我一直在用 ASP.NET 和 C# 玩弄它。现在很基本;目前是三页,这个过程基本上是挑选你的物品,挑选你想要的数量,然后将它/它们添加到你的购物车。
前两页工作完美...购物车是我遇到麻烦的地方。购物车页面的要点是它动态构建一个表格,其中包含有关添加的产品的相关信息。每次用户返回商品页面并选择另一个商品时,它应该将其添加到购物车表的最后一行。
我使用会话状态来跟踪购物车页面的页面访问之间的购物车。当我第一次启动页面并添加第一个项目时,它工作得很好,我得到了我应该在页面上看到的内容(见下面的截图):
Screenshot of first item added
不幸的是,从那里开始走下坡路。一旦您尝试添加另一个项目,或者甚至只是在查看购物车时单击“购物车”菜单链接,所有输入的信息都会消失。 (顺便说一句,不知道它是否相关,但是在将任何东西添加到购物车之前单击“购物车”菜单链接不会产生相同的行为。所以我希望将其缩小到它是发生在添加一个项目之后。)
Screenshot of cart after simply clicking the 'Cart' menu link
这是我购物车的 C# 代码隐藏文件中的代码块,负责将数据添加到页面上的表格中。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class viewCart : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["myTable"] != null)
{
tblCartItems = (Table)Session["myTable"];
for (int i = 1; i < tblCartItems.Rows.Count; i++)
{
tblCartItems.Rows.Add(tblCartItems.Rows[i]);
}
}
if (Request.QueryString["qty"] != null)
{
string item = Request.QueryString["item"];
int qty = int.Parse(Request.QueryString["qty"]);
double price = double.Parse(Request.QueryString["price"]);
TableRow row = new TableRow();
row.Cells.Add(addCell(item));
row.Cells.Add(addCell(qty.ToString()));
row.Cells.Add(addCell(price.ToString()));
row.Cells.Add(addCell(extPrice(qty, price).ToString()));
row.Cells.Add(addCell("<asp:Button ID=\"btn_RemoveRow\" runat=\"server\" Text=\"Remove Item\" />"));
tblCartItems.Rows.Add(row);
Session["myTable"] = tblCartItems;
}
}
}
如果您在不添加任何商品的情况下进入购物车页面,您会看到的初始表(这是一个标准的、简单的 ASP.NET 表,没有什么特别花哨的)只是表标题,这些编码在购物车的 .aspx 文件,不在后面的代码中。所以后面的所有代码都是从 item.aspx 页面(您选择所需商品数量的页面)获取数据,并通过 URL 查询字符串将信息传递到购物车页面。我还在这个小应用程序中使用母版页(以防万一)。
我有 95% 的把握自己走在正确的轨道上,而且我只是错过了一些愚蠢的小事。如果有人能指出我正确的方向,我将非常感激,因为这让我整天发疯!
【问题讨论】:
-
为什么我们将整个 html 表存储在会话中,为什么我们不将项目或项目列表存储在会话中,然后将其绑定到网格、中继器等
-
问题可能出在条件IsPostback上,你调试了吗?
-
@HaseebAsif 我考虑只存储我添加的行,因为我已经在 .aspx 文件中构建了标题。 (这就是我在 i = 1 处开始 for 循环的原因,以便它会拉出数据行而不是标题行)。至于 IsPostBack 条件,当我调试它时,程序进入 if(!IsPostBack) 语句,但随后仅在页面的第一次运行时跳过两个内部语句(我认为这是我看到页面时想要的首先没有理由解雇这两个)。
标签: c# asp.net session-state