Cookies和ASP.NET让我发疯

时间:2010-02-13 22:15:17

标签: asp.net .net-3.5 cookies

我创建了一个简单的购物车应用程序。我们需要特定于我们需求的东西,长篇大论。无论如何,我将购物车对象存储在cookie中。这工作正常,但我在课堂上删除购物车cookie时遇到了麻烦。购物车对象包含一组产品(iList)。这是我用来删除cookie的代码: 我的空车代码:

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。如果在codebehind for和ASPX页面内部我尝试寻找过期的cookie(Request.Cookies(theName)),它永远找不到它。这就是我希望它在课堂上做的事情。

丹尼尔

3 个答案:

答案 0 :(得分:2)

您是在背靠背还是在下一次回发中运行语句?

您只是加载过期的Cookie,因为您没有删除Cookie,您刚刚添加了过期的Cookie,不是吗?

输入看起来像捕获22的东西,但实际上是代码味道......

要删除浏览器上的Cookie,您必须send an expired cookie。但是,如果您在同一周期的代码中使用cookie作为数据对象,则必须管理cookie集合。

将一个回发专门用于删除cookie或使用clr对象在代码隐藏中跟踪您的购物车。例如将cookie加载到page_load上的对象中,并在退出之前从对象设置cookie,但不要引用Cookies集合。

P.S。虽然我有一段时间没有使用cookies进行擦除,但如果你想要更换cookie,请尝试使用Cookies.Remove()并添加新的,它应该替换浏览器上的旧cookie,同时在集合中保留一个有效的cookie为了你。但我仍然不建议将cookie集合用作代码后面的数据存储......

答案 1 :(得分:2)

  

出于某种原因,即使我运行删除cookie(空车)代码,然后运行我的LoadCartFromCookie代码(从Cart类内部),它仍然会使用过期的cookie。

在我看来,你是在同一个请求中这样做的。只有在服务器响应更新的cookie且某些过期日期后,才会在客户端浏览器中删除Cookie。因此,请在“LoadCartFromCookie”中更新您的代码,以检查到期日期 而IMO将购物车信息保存在数据库中要好得多。所以它将在所有浏览器之间共享。

答案 2 :(得分:0)

要使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