ASP.NET Core中Session购物车数量更新失效问题求助
搞定ASP.NET Core购物车数量不更新的问题
嗨,我帮你找到了问题的核心所在,咱们一步步来解决这个购物车数量不更新的bug!
问题出在哪?
你在HttpPost Cart方法里成功增加了商品数量,但跳转到HttpGet Cart后又变回旧值,本质原因是:你修改了内存中列表的商品属性,但没有把更新后的列表重新存回Session。ASP.NET Core的Session存的是对象序列化后的快照,内存里改了对象属性,Session不会自动同步,必须手动把新的列表写回去才行。
直接修改你的代码
把你的HttpPost Cart方法改成下面这样,关键就是加一行重新存入Session的代码:
[HttpPost] public IActionResult Cart(int id) { List<Spray> spray = HttpContext.Session.Get<List<Spray>>("spray"); var item = spray.SingleOrDefault(x => x.Id.Equals(id)); if (item != null) { item.Quantity++; // 这行是关键!把更新后的列表重新存回Session HttpContext.Session.Set("spray", spray); } return RedirectToAction(nameof(Cart)); }
为啥之前的代码不行?
原来的代码里,你只是从Session取出列表、改了元素的Quantity,但没把改好的列表重新写入Session。等你跳转到Get方法时,又从Session里读了旧的序列化数据,自然看不到更新后的数量啦。
额外小检查(如果还没好的话)
要是改完还是有问题,你可以检查下Utility.SessionExtensions的Set和Get方法是不是正确实现了序列化。比如是不是用了正确的JSON序列化方式,确保对象的修改能被正确存进Session。给你一个常用的实现参考:
public static class SessionExtensions { public static void Set<T>(this ISession session, string key, T value) { session.SetString(key, JsonSerializer.Serialize(value)); } public static T Get<T>(this ISession session, string key) { var value = session.GetString(key); return value == null ? default(T) : JsonSerializer.Deserialize<T>(value); } }
这样改完之后,你再点击“+”按钮,购物车的数量应该就能正常更新啦!
内容的提问来源于stack exchange,提问作者Pritom Sarkar
相关产品推荐
相关产品推荐

