我已经创建了一个简单的购物车应用程序。我们需要一些特定的东西来满足我们的需求,说来话长。无论如何,我将购物车对象存储在一个cookie中。这很好用,但我在从类中删除购物车cookie时遇到了问题。购物车对象包含一个产品集合(iList)。下面是我用来删除cookie的代码: My Empty Cart Code:
Dim currentCookie As HttpCookie = HttpContext.Current.Response.Cookies(cookieName)
currentCookie.Expires = DateTime.Now.AddYears(-30)
HttpContext.Current.Response.Cookies.Add(currentCookie)
我的LoadCartFromCookie代码:
if not HttpContext.Current.Request.Cookies(theCookieName) is nothing then
_cart = CType(HttpContext.Current.Request.Cookies(theCookieName).value,Cart)
End If
我的购物车类构造函数首先尝试从cookie加载购物车。如果找到cookie,则加载购物车对象,否则将创建一个没有任何详细信息的购物车新实例。出于某些原因,即使我运行删除cookie (空购物车)代码,然后运行我的LoadCartFromCookie代码(从Cart类内部),它仍然加载过期的cookie。有什么想法吗?我认为这可能是浏览器的问题,但我尝试了IE8,FF 3.5和Chrome。如果在代码隐藏和ASPX页面中,我尝试查找过期的cookie (Request.Cookies(theName)),它永远也找不到。这就是我想让它在类中做的事情。
丹尼尔
发布于 2010-02-13 22:27:48
您是背靠背运行语句,还是在下一次回发时运行语句?
您正在加载过期的cookie,因为您没有删除cookie,您只是添加了过期的cookie,不是吗?
输入看起来像是22号军规的东西,实际上是一种代码气味……
要删除浏览器上的cookie,您必须使用send an expired cookie。但是,如果在同一周期内在代码中使用cookie作为数据对象,则必须管理cookie集合。
或者只使用一个回发来删除cookie,或者使用clr对象来跟踪代码隐藏中的购物车。例如,将cookie加载到page_load上的对象中,并在退出之前从对象设置cookie,但不要引用cookie集合。
附注:虽然我已经有一段时间没有使用cookie了,但是如果您想替换cookie,请尝试Cookies.Remove()并添加新的cookie,它应该替换浏览器上的旧cookie,同时在集合中为您保留一个有效的cookie。但我仍然不建议在代码中使用cookie集合作为数据存储……
发布于 2010-02-13 22:30:37
出于某种原因,即使我运行删除
(空购物车)代码,然后运行我的LoadCartFromCookie代码(从Cart类内部),它仍然加载过期的cookie。
在我看来,您是在同一个请求中这样做的。客户端浏览器中的Cookie仅在收到来自服务器的响应后才会被删除,更新后的cookie将过期。因此,在"LoadCartFromCookie“中更新您的代码,以检查到期日期。
在数据库中保存购物车信息要好得多。所以它将在所有浏览器之间共享。
发布于 2010-02-13 22:24:42
要使cookie过期,请尝试执行以下操作:
Dim cookie = HttpContext.Current.Request.Cookies(cookieName)
If Not cookie Is Nothing Then
cookie.Expires = DateTime.Now.AddYears(-1)
HttpContext.Current.Response.SetCookie(currentCookie)
End If
https://stackoverflow.com/questions/2259281
复制