2012-02-06 15 views
24

Deseo registrar el parámetro de unas pocas páginas en mi sitio web utilizando cookies. He probado el código de abajo, pero no me gusta lo que quiero:Uso de cookies en asp.net mvc C#

public ActionResult Index(int? dep, int? cat) 
{ 
    ...... 
    string theDept = Request.QueryString["dep"]; 
    HttpCookie cookie = new HttpCookie("search"); 
    cookie.Values["dep_name"] = theDept; 
    cookie.Expires = DateTime.Now.AddDays(1); 
    Response.Cookies.Add(cookie); 
    return View(); 
} 

lo leí en Site.Master:

<% 

HttpCookie cookie = Request.Cookies["search"] ; 

if ((cookie != null) && (cookie.Value != "")) 
{ 
    Response.Write(cookie.Values["dep_name"].ToString() + "---" + 
    cookie.Values["cat_name"].ToString() + "---" + cookie.Values["brand"].ToString()); 
} 
%> 

Problema: Cuando hago clic a otra página que Request.QueryString["dep"] es nula, la cookie que La pantalla es nula para.

¿Cómo almacenarlo en la cookie sin perder mientras aún no borramos la cookie?

Respuesta

56

No estoy seguro de entender si esta es una pregunta acerca de cómo enviar correctamente las cookies al cliente o algún error con sus parámetros de cadena de consulta. Así que publicaré la forma correcta de enviar cookies y me sentiré libre de corregirme si no entendí bien.

En cualquier caso, sin embargo, creo que esto:

HttpCookie cookie = new HttpCookie("search"); 

se restablecerá la cookie de búsqueda

Para obtener una cookie:

HttpCookie cookie = HttpContext.Request.Cookies.Get("some_cookie_name"); 

Para comprobar la existencia de una cookie:

HttpContext.Request.Cookies["some_cookie_name"] != null 

Para guardar una cookie:

HttpCookie cookie = new HttpCookie("some_cookie_name"); 
HttpContext.Response.Cookies.Remove("some_cookie_name"); 
HttpContext.Response.SetCookie(cookie); 
+0

que he estado haciendo cosas web durante casi seis años y se me dio una tarea que implica el establecimiento de una galleta por primera vez hace poco. Cosas raras y salvajes. Esto ayuda, gracias! – MrBoJangles

+4

Para aclarar, ¿dónde pondrías este código dentro del proyecto MVC para evitar llenar tus controladores con basura? –

+0

¿no elimina la línea 'HttpContext.Response.Cookies.Remove' la cookie que no la está guardando? – Jaylen

14

he organizado el ir a buscar la galleta y la inserción de una manera organizada de tal manera que se puede utilizar en toda la aplicación. para ese propósito puse dos métodos SetCookie y GetCookie.

Simplemente puede poner esta clase en su código y hacer ejercicio.

Aquí pongo mi clase con los métodos estáticos

public class CookieStore 
{ 
    public static void SetCookie(string key, string value, TimeSpan expires) 
    { 
     HttpCookie encodedCookie = HttpSecureCookie.Encode(new HttpCookie(key, value)); 

     if (HttpContext.Current.Request.Cookies[key] != null) 
     { 
      var cookieOld = HttpContext.Current.Request.Cookies[key]; 
      cookieOld.Expires = DateTime.Now.Add(expires); 
      cookieOld.Value = encodedCookie.Value; 
      HttpContext.Current.Response.Cookies.Add(cookieOld); 
     } 
     else 
     { 
      encodedCookie.Expires = DateTime.Now.Add(expires); 
      HttpContext.Current.Response.Cookies.Add(encodedCookie); 
     } 
    } 
    public static string GetCookie(string key) 
    { 
     string value = string.Empty; 
     HttpCookie cookie = HttpContext.Current.Request.Cookies[key]; 

     if (cookie != null) 
     { 
      // For security purpose, we need to encrypt the value. 
      HttpCookie decodedCookie = HttpSecureCookie.Decode(cookie); 
      value = decodedCookie.Value; 
     } 
     return value; 
    } 

} 

utilizando estos se pueden almacenar fácilmente los valores de la galleta a buscar el valor siempre que sea necesario

el uso de estos métodos es tan simple como

Para establecer la cookie:

CookieStore.SetCookie("currency", "GBP", TimeSpan.FromDays(1)); // here 1 is no of days for cookie to live 

Para conseguir Cookie:

string currency= CookieStore.GetCookie("currency"); 
+0

Al guardar, ¿por qué actualizar la cookie existente en lugar de configurar una nueva? –

+1

Tengo un problema que encuentro la cookie dos veces cuando se ve en la vista rápida uno con fecha de caducidad como enero 1 0001, así que pensé en actualizarlo. –

+0

¿Está utilizando HttpSecureCookie desde http://www.nuget.org/packages/httpsecurecookie/? –