Question

I have the following code that sets a cookie:

  string locale = ((DropDownList)this.LoginUser.FindControl("locale")).SelectedValue;
  HttpCookie cookie = new HttpCookie("localization",locale);
  cookie.Expires= DateTime.Now.AddYears(1);
  Response.Cookies.Set(cookie);

However, when I try to read the cookie, the Value is Null. The cookie exists. I never get past the following if check:

         if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))

Help?

Was it helpful?

Solution

The check is done after a post back? If so you should read the cookie from the Request collection instead.

The cookies are persisted to the browser by adding them to Response.Cookies and are read back from Request.Cookies.

The cookies added to Response can be read only if the page is on the same request.

OTHER TIPS

The most likely answer is seen on this post

When you try to check existence of a cookie using Response object rather than Reqest, ASP.net automatically creates a cookie.

Edit: As a note, I ended up writing software that needed to check the existence of cookies that ASP.NET makes a nightmare due to their cookie API. I ended up writing a conversion process that takes cookies from the request and makes my state object. At the end of the request I then translate my state object back to cookies and stuff them in the response (if needed). This alleviated trying to figure out if cookies are in the response, to update them instead, avoiding creating of pointless cookies etc.

Have you tired "Request" collection instead of "Response" collection?

if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))

I think I know the answer.

Just REMOVE the action attribute in your <form> tag.

make it look like this: <form id="form1" runat="server">

instead of this: <form id="form1" action="DisplayName.aspx" runat="server">

You should then use Response.Redirect("DisplayName.aspx"); in your code.

if you're compiling in debug mode, turn on tracing for the pages in question and make sure the cookie is in the request collection. Set trace in the @page directive in the aspx file.

Try this snippet -

string locale = ((DropDownList)this.LoginUser.FindControl("locale"))
                                                    .SelectedValue;  
HttpCookie myCookie = new HttpCookie("localization");
Response.Cookies.Add(myCookie);
myCookie.Values.Add("locale", locale);
Response.Cookies["localization"].Expires = DateTime.Now.AddYears(1);

& to read it -

if (Request.Cookies["localization"] != null)
{
   HttpCookie cookie = Request.Cookies["localization"];
   string locale = cookie.Values["locale"].ToString();
}

I had a similar problem, I couldn't read cookies on postback. The issue for me was that I checked the Secure property of the cookie to true. It is said that when the Secure property of the cookie is turned on, it causes the cookie to be transmitted only if the connection uses the Secure Sockets Layer. I am not sure, however, how I was able to see the cookie in the browser the first time, but not on postback, considering that I wasn't transmitting over SSL. Anyhow, turning the cookie.Secure to false, solved the problem, and had cookies read on postback.

Sorry if this doesn't have to do anything with your issue, I wanted to share this, because I spent some time looking how to resolve this.

Would add this as a comment to Chris Marisic's answer but I don't have that privelage :-(

Further to what Chris said in his edit about removing cookies from the request, to be able to read the newly created cookies value in a postback I ended up doing

Private Sub SetPageSize(ByVal pageSize As Integer)

    ' Set cookie value to pageSize
    Dim pageSizeCookie As HttpCookie = New HttpCookie(pageSizeCookieName)
    With pageSizeCookie
        .Expires = Now.AddYears(100)
        .Value = pageSize.ToString
    End With

    ' Add to response to save it
    Me.Response.Cookies.Add(pageSizeCookie)

    ' Add to request so available for postback
    Me.Request.Cookies.Remove(pageSizeCookieName)
    Me.Request.Cookies.Add(pageSizeCookie)

End Sub

The Request.Cookies.Remove and Request.Cookies.Add lines making it work on postbacks

use Response.Cookies.Add(cookie); instead of Response.Cookies.Set(cookie);

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top