饼干在页面刷新之前不会更新...如何避免?

时间:2011-02-16 14:38:49

标签: asp.net cookies

我有一些读取和写入cookie值的asp.net页面。在页面的生命周期中,它可以更新cookie值,然后需要在代码中再次读取它。我发现它是在页面刷新之前没有获得cookie的最新值。有没有解决的办法?这是我用来设置和获取值的代码。

public static string GetValue(SessionKey sessionKey)
        {
            HttpCookie cookie = HttpContext.Current.Request.Cookies[cookiePrefix];
            if (cookie == null)
                return string.Empty;

            return cookie[sessionKey.SessionKeyName] ?? string.Empty;
        }

        public static void SetValue(SessionKey sessionKey, string sessionValue)
        {
            HttpCookie cookie = HttpContext.Current.Request.Cookies[cookiePrefix];
            if (cookie == null)
                cookie = new HttpCookie(cookiePrefix);

            cookie.Values[sessionKey.SessionKeyName] = sessionValue;
            cookie.Expires = DateTime.Now.AddHours(1);
            HttpContext.Current.Response.Cookies.Set(cookie);
        }

2 个答案:

答案 0 :(得分:4)

您缺少的是,当您使用SetValue更新cookie时,您正在写入Response.Cookies集合。

当您调用GetValue时,您正在从Request.Cookies集合中读取。

您需要以访问当前信息的方式存储瞬态信息,而不仅仅是直接访问请求cookie。

执行此操作的一种可能方法是编写一个包装类,使用粗糙的伪代码将类似于

public CookieContainer(HttpContext context)
{    
    _bobValue = context.Request.Cookies["bob"];    
}

public Value
{    
    get { return _bobValue; }
    set { 
            _bobValue = value; 
            _context.Response.Cookies.Add(new Cookie("bob", value) { Expires = ? }); 
        }    
}

本周我遇到了需要做类似代码的问题。 cookie处理模型非常奇怪。

答案 1 :(得分:1)

开始使用会话来存储您的信息,即使它只是暂时的。

Cookie会在页面呈现之前依赖于发送到浏览器的标头。如果您已经向客户端发送了信息,那么继续设置cookie,您将看到您所描述的“页面刷新延迟”。

如果需要具有此值,请在设置cookie和刷新页面之间使用会话变量。但是,即便如此,我也建议在处理步骤中尽早避免设置cookie,并尝试尽早设置它。