【问题标题】:Why is my session cart list empty?为什么我的会话购物车列表是空的?
【发布时间】:2012-10-31 19:05:14
【问题描述】:

当我调试我的 actionresult AddToCart。我的购物车获得了 productId 的值,该值在这里运行良好:

public ActionResult AddToCart(int productID)
    {
        List<int> cart = (List<int>)Session["cart"];
        if (cart == null){
           cart = new List<int>();
        }
        cart.Add(productID);

        return new JsonResult() { Data = new { Status = "Success" } };
    }

我正在使用 ajax 来获取 productID:

$(function () {
            $(".a").live("click", function () {
                var $this = $(this),
            productID = $this.data('productID');
                $.ajax({
                    url: '/Home/AddToCart',
                    type: "post",
                    cache: false,
                    data: { productID: productID },
                    success: function (data) {
                        data = eval(data);
                        $this.addClass('productSelected');
                    },
                    error: function (result) {
                        $(".validation-summary-errors").append("<li>Error connecting to server.</li>");
                    }

                });
            });

        });

但是当我执行这个 actionresult 时,我的购物车是空的:

public ActionResult ShoppingCart()
{
    var cart = Session["cart"] as List<int>;

    var products = cart != null ? cart.Select(id => 
             {
                 var product = repository.GetProductById(id);
                 return new ProductsViewModel
                    {
                       Name = product.Name,
                       Description = product.Description,
                       price = product.Price
                    }
             }) : new List<ProductsViewModel>();

    return PartialView(products);
}

我做错了什么?为什么 actionresult Shoppingcart 有空值这是怎么发生的?当我调试 AddToCart 时,Cart 得到一个值并被添加。

【问题讨论】:

    标签: c# ajax asp.net-mvc asp.net-mvc-3 session


    【解决方案1】:

    您应该在向其添加项目后更新会话内的购物车对象:

    public ActionResult AddToCart(int productID)
    {
        List<int> cart = (List<int>)Session["cart"];
        if (cart == null){
           cart = new List<int>();
        }
        cart.Add(productID);
    
        Session["cart"] = cart;
    
        return new JsonResult() { Data = new { Status = "Success" } };
    }
    

    【讨论】:

    • IIRC 这仅在 session-variable-was-null 情况下是必需的;如果会话中已经有一个购物车,那么会话变量和局部变量引用同一个列表,更新一个会更新另一个。 (参见例如here。)
    【解决方案2】:

    您也需要更新会话购物车,像这样...

    public ActionResult AddToCart(int productID)
    {
        List<int> cart = (List<int>)Session["cart"];
        if (cart == null){
           Session["cart"] = cart = new List<int>();
        }
        cart.Add(productID);
    
        return new JsonResult() { Data = new { Status = "Success" } };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      相关资源
      最近更新 更多