代码之家  ›  专栏  ›  技术社区  ›  Blair Scott

使用jquery的ASP.NET MVC会话

  •  2
  • Blair Scott  · 技术社区  · 15 年前

    问题解决: 我忽略了一个非常简单的问题,那就是这实际上是在一个网站上运行的两个不同的应用程序。我稍微修改了Ajax调用中的URL以反映这一点,问题就不再发生了。

    原始问题:

    我有一个奇怪的问题,我希望有人能帮我弄清楚情况。

    我有一个页面,你的标准问题购物车,在那里我试图通过Ajax提交促销代码。除了我的会话状态外,一切都正常。当我第一次加载购物车页面时,我会在会话中查找购物车(如果没有,我会模拟一个购物车,因为我现在只是模板/测试东西),在返回视图之前,我会将购物车保存回会话。我在Ajax操作中做了同样的事情,它返回一个局部视图。

    问题出在这里:

    似乎两个不同版本的购物车从会话中恢复过来,这取决于我要执行的操作,当然这不是我要执行的操作。

    以下是我如何判断存在问题的方法:

    1. 我开始加载页面,模拟购物车保存到会话。
    2. 重新加载页面以检查购物车是否已正确保存到会话。
    3. 输入促销代码,购物车检索过程的断点显示会话中没有购物车。
    4. 模拟购物车再次保存到会话,这次应用折扣。
    5. 再次重新加载页面,从会话中检索到购物车,但这是我保存的第一个购物车。
    6. 重新输入促销代码,这一次它会在会话中找到一个购物车,但它已经应用了折扣。
    7. 然后我重复这个过程好几次,以再次检查我的神智,但我所描述的是非常符合我描述的。

    所以现在我很困惑,也很沮丧,因为这是我目前唯一的方式。我希望这是一个简单的东西,我错过了,但搜索这个问题(这里和谷歌)给我的结果涵盖了一个非常广泛的主题。

    编辑:根据下面的请求,这里是保存/检索购物车的代码:

    private void SaveCart(ShoppingCartContainer cart)
    {
        Session["Cart"] = cart;
    }
    
    private ShoppingCartContainer RetrieveCart()
    {
        ShoppingCartContainer cart = (ShoppingCartContainer)Session["Cart"];
        if (cart != null)
        {
            return cart;
        }
        return null;
    }
    

    编辑:以下是操作方法

    public ActionResult ListItems(string userid)
    {
        var retval = RetriveCart();
        if( retval == null)
        {
            retval = _model.Show(userid);
            if (retval == null)
            {
                return Redirect("/");
            }
        }
        SaveCart(retval);
        return View("List", retval);
    }
    
    public ActionResult ApplyPromoCode(string promocode, string userid)
    {
        var cart = RetriveCart();
        if (cart == null)
        {
            cart = _model.Show("blah");
        }
        cart = _model.ApplyPromoCode(promocode, "blah");
        SaveCart(cart);
        if (Request.IsAjaxRequest())
        {
            return PartialView("ShoppingCartFooter", cart);
        }
        return RedirectToAction("ListItems", new { userid = "blah" });
    }
    

    注意:正如我所说,我正在进行模板化/测试,因此检索和保存调用之间的一些代码可能有点荒谬。不过,我或多或少地排除了这些问题,因为问题发生在我还没有解决这些问题之前。

    更新: 进一步确认我对所发生的事情的怀疑是,当我简单地提交表单而没有jquery捕获表单提交时,购物车会正确保存,这样当我正常加载页面时,促销代码仍然适用。

    更新第2号: 只是研究了第一次Ajax调用时发生的事情。在第一次Ajax调用时,session变量的“isNewSession”属性似乎设置为New,尽管我已经在到达页面时启动了。我无法解释为什么会发生这种情况,但这里有一些可能相关的更多信息:

    我们正在使用温莎控制器工厂(我的意思不是“我们”,我只是将模板连接到视图,并执行足够的后端代码以使流正常工作),我不熟悉它,但这可能是问题的一部分吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Gregoire    15 年前

    您确定在这两个操作中使用相同的购物车会话变量吗?