问题解决:
我忽略了一个非常简单的问题,那就是这实际上是在一个网站上运行的两个不同的应用程序。我稍微修改了Ajax调用中的URL以反映这一点,问题就不再发生了。
原始问题:
我有一个奇怪的问题,我希望有人能帮我弄清楚情况。
我有一个页面,你的标准问题购物车,在那里我试图通过Ajax提交促销代码。除了我的会话状态外,一切都正常。当我第一次加载购物车页面时,我会在会话中查找购物车(如果没有,我会模拟一个购物车,因为我现在只是模板/测试东西),在返回视图之前,我会将购物车保存回会话。我在Ajax操作中做了同样的事情,它返回一个局部视图。
问题出在这里:
似乎两个不同版本的购物车从会话中恢复过来,这取决于我要执行的操作,当然这不是我要执行的操作。
以下是我如何判断存在问题的方法:
-
我开始加载页面,模拟购物车保存到会话。
-
重新加载页面以检查购物车是否已正确保存到会话。
-
输入促销代码,购物车检索过程的断点显示会话中没有购物车。
-
模拟购物车再次保存到会话,这次应用折扣。
-
再次重新加载页面,从会话中检索到购物车,但这是我保存的第一个购物车。
-
重新输入促销代码,这一次它会在会话中找到一个购物车,但它已经应用了折扣。
-
然后我重复这个过程好几次,以再次检查我的神智,但我所描述的是非常符合我描述的。
所以现在我很困惑,也很沮丧,因为这是我目前唯一的方式。我希望这是一个简单的东西,我错过了,但搜索这个问题(这里和谷歌)给我的结果涵盖了一个非常广泛的主题。
编辑:根据下面的请求,这里是保存/检索购物车的代码:
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,尽管我已经在到达页面时启动了。我无法解释为什么会发生这种情况,但这里有一些可能相关的更多信息:
我们正在使用温莎控制器工厂(我的意思不是“我们”,我只是将模板连接到视图,并执行足够的后端代码以使流正常工作),我不熟悉它,但这可能是问题的一部分吗?