2009-06-30 11 views
5

Sto riscontrando un problema relativo alla perdita di un cookie che sto impostando direttamente dopo la chiamata a RedirectToAction(). C'è qualcosa dietro le quinte che invalida la richiesta corrente e ne crea una nuova che fa perdere il cookie prima che sia stato salvato su disco?Il cookie non viene mantenuto in MVC

Capisco che se si desidera che i dati siano disponibili dopo il reindirizzamento è necessario utilizzare TempData, ma è lo stesso per i cookie? Se è così, non sembra brutto dover memorizzare il valore del cookie in TempData e quindi scrivere il cookie in un secondo momento?

Aggiornamento:

Ho appena realizzato che il cookie viene perso alla fine della richiesta, non importa se io chiamo RedirectToAction(). Quindi ora la domanda è: perché il cookie non accresce due richieste? (Aggiorno il codice qui sotto per mostrare quello che sto facendo ora)

public ActionResult DoSomething() 
{ 
    Response.Cookies["SomeCookie"].Value = "Jarified"; 
    Response.Cookies["SomeCookie"].Expires = DateTime.UtcNow.AddDays(3); 

    return View("SomeView"); 

} 

Aggiornamento

ho creato un nuovo progetto MVC utilizzando il modello predefinito. Ho modificato l'azione HomeController/Index per avere il codice qui sotto. La prima volta che visualizzo "Cookie Not Found" viene stampato come previsto. Tuttavia, ogni volta successiva viene stampato lo stesso messaggio. Se rimuovo la linea che imposta la data di scadenza, tutto funziona perfettamente. Immagino che la vera domanda qui sia perché rende persistente il cookie perché il browser lo butta via? C'è un trucco per rendere persistenti i cookie in MVC?

public ActionResult Index() 
    { 
     HttpCookie cookie = Request.Cookies["temp"]; 
     if (cookie == null) 
     { 
      ViewData["Message"] = "Cookie Not Found"; 
      Response.Cookies["temp"].Value = "Welcome to ASP.NET MVC!"; 
      Response.Cookies["temp"].Expires = DateTime.UtcNow; 
     } 
     else 
     { 
      ViewData["Message"] = cookie.Value; 
     } 
     return View(); 
    } 

risposta

5

La ragione per cui

Response.Cookies["temp"].Expires = DateTime.UtcNow; 

non funziona è che si imposta un cookie con una scade in passato (almeno per me).

Funziona quando lo cambio a

Response.Cookies["temp"].Expires = DateTime.UtcNow.AddDays(3); 

impostando un cookie scade struttura al passato, cancellerà il cookie.

Questo codice funziona per me:

public ActionResult Index() { 
     HttpCookie cookie = Request.Cookies["temp"]; 
     if (cookie == null) { 
      ViewData["Message"] = "Cookie Not Found"; 
      Response.Cookies["temp"].Value = "This is a cookie: Welcome to ASP.NET MVC!"; 
      Response.Cookies["temp"].Expires = DateTime.UtcNow.AddDays(3); 
     } else { 
      return RedirectToAction("Something"); 
     } 
     return View(); 
    } 

    public ActionResult Something() { 
     HttpCookie cookie = Request.Cookies["temp"]; 
     ViewData["Message"] = cookie.Value; 
     return View(); 
    } 
+0

Ieri sera tardi ho capito che se ho cambiato il secondo campione per DateTime.UtcNow .AddDays (3); stava funzionando. Quello che ancora non mi è chiaro è perché il mio primo esempio non funzioni per me. Penso che il mio problema originale fosse il valore che stavo memorizzando -non è "Jarified" ma una stringa molto più lunga. Mi chiedo se la data di scadenza stia causando una lunghezza superiore a 4K. Grazie per la risposta! – Joe

0

Ecco un uno di linea per impostare una data di scadenza dei cookie e

Response.Cookies.Add(new HttpCookie("myCookie", "cookie value") 
    { Expires = DateTime.Now.AddDays(1)}); 
Problemi correlati