【问题标题】:Restoring a table from session state in ASP.NET在 ASP.NET 中从会话状态恢复表
【发布时间】: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


【解决方案1】:

看起来您为页面上的表格和要退出会话状态的变量选择了相同的变量名称。

所以在第一次加载时 Session["myTable"] 为空,然后您进入第二个块,构建 HTML 表并将其存储到会话状态。然后在第二次加载时,将 HTML 表从会话状态中拉出,并尝试覆盖页面本身上的表(然后将行从会话对象复制到自身)。

    if (Session["myTable"] != null)
    {
        Table tblCartItemsSession = (Table)Session["myTable"];

        for (int i = 1; i < tblCartItemsSession.Rows.Count; i++)
        {
            tblCartItems.Rows.Add(tblCartItemsSession.Rows[i]);
        }
    }

我认为上述更改应该有效,尽管我还没有测试过。

另外,存储 HTML 对象不是最佳实践,您应该创建一个 Cart 对象,然后编写一些转换逻辑来显示 Cart 对象中的表格,这里有一个示例来帮助解决这个问题。

首先,虚拟对象:

public class CartItem 
{
    public string item { get; set; }
    public int qty { get; set; }
    public double price { get; set; }
}

然后顶部变为:

List<CartItem> items = new List<CartItem>();
if (Session["myCart"] != null)
{
    Items = (List<CartItem>)Session["myCart"];
}

然后,将新对象(由查询字符串变量制成)添加到列表中

items.Add(new CartItem() {
   item = item,
   qty = qty,
   price = price
});

然后,显示项目列表,我建议为此使用网格视图,它只是让它更容易一些(参见:http://www.c-sharpcorner.com/UploadFile/7eb164/gridview-control-in-Asp-Net/),最后将项目列表保存到您的会话变量中

【讨论】:

  • 这工作......有点。但我只能添加两行。当我开始添加更多项目时,它会不断替换底行。此外,制作购物车对象是一个非常好的主意。但是我不需要保存表格吗?我无法设置有限数量的购物车对象来保存会话状态,因为我无法提前知道要添加多少商品。
  • 我已经编辑了答案,并为您提供了一个带有帮助对象的示例,这只会将原始数据保存到会话中,而不是 HTML 对象。
【解决方案2】:

这可能对原始海报没有帮助,但可能对其他人有所帮助。我处于完全相同的位置,有一个截止日期,并且 c# 知识低于标准,所以我使用了一个很好的老技巧:我在我的数据库中创建了一个购物车表,并将其绑定到网页中的 gridview,使用适当的添加、清除、重置等控件。

这可能不是最好的解决方案,但它确实帮助了我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2013-09-06
    • 2011-06-07
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多