Biscoito perde valor em ASP.net
Pergunta
Eu tenho o seguinte código que define um 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);
No entanto, quando tento ler o cookie, o valor é nulo. o cookie existe. Eu nunca ter passado o seguinte, se verificar:
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
Ajuda?
Solução
A verificação é feita depois de um posto de volta? Se assim for, você deve ler o cookie da coleção Request vez.
Os biscoitos são persistentes para o navegador, adicionando-os Response.Cookies e são lidos de volta de Request.Cookies.
Os biscoitos adicionados a resposta pode ser lido somente se a página está no mesmo pedido.
Outras dicas
A resposta mais provável é visto na este post
Quando você tenta verificar a existência de um usando o objeto de resposta de cookie em vez de Reqest, ASP.net cria automaticamente um cookie.
Editar: Como uma nota, acabei escrevendo software que precisava para verificar a existência de cookies que ASP.NET faz um pesadelo devido à sua API cookie. Acabei escrevendo um processo de conversão que leva os cookies do pedido e faz o meu objeto de estado. No final do pedido I, em seguida, traduzir o meu objeto de estado de volta para biscoitos e enchê-los na resposta (se necessário). Isso aliviou tentando descobrir se os cookies estiverem na resposta, para atualizá-los em vez disso, evitando a criação de cookies inúteis etc.
Você já cansado coleção "Request" em vez de coleta de "Resposta"?
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
Eu acho que sei a resposta.
Apenas remover o atributo de ação em sua tag <form>
.
torná-lo parecido com este: <form id="form1" runat="server">
em vez disso: <form id="form1" action="DisplayName.aspx" runat="server">
Você deve então usar Response.Redirect("DisplayName.aspx");
em seu código.
Se você está compilando no modo de depuração, ative o rastreio para as páginas em questão e certifique-se o cookie está na coleção pedido. Set traço na directiva @page no arquivo aspx.
Tente esse trecho -
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);
& lê-lo -
if (Request.Cookies["localization"] != null)
{
HttpCookie cookie = Request.Cookies["localization"];
string locale = cookie.Values["locale"].ToString();
}
Eu tive um problema semelhante, eu não conseguia ler cookies no postback. O problema para mim foi que eu verificado a propriedade segura do cookie para true. Diz-se que quando a propriedade segura do cookie é ligado, ele faz com que o cookie para ser transmitido somente se a conexão usa o Secure Sockets Layer. Não estou certo, no entanto, como eu era capaz de ver o cookie no navegador pela primeira vez, mas não em postback, considerando que eu não estava transmitindo através de SSL. De qualquer forma, transformando o cookie.Secure como falsa, resolveu o problema, e teve biscoitos ler no postback.
Desculpe se isso não tem que fazer qualquer coisa com seu problema, eu queria compartilhar isso, porque eu passei algum tempo a olhar como resolver isso.
gostaria de acrescentar isso como um comentário à resposta de Chris Marisic mas eu não tenho que privelage: - (
Na sequência do que Chris disse em sua edição sobre a remoção de cookies do pedido, para ser capaz de ler o valor biscoitos recém-criado em um postback eu acabei fazendo
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
As linhas Request.Cookies.Remove e Request.Cookies.Add fazê-lo funcionar em postbacks
uso Response.Cookies.Add (cookie); em vez de Response.Cookies.Set (cookie);