2009-06-30 10 views
5

Mam problem, gdy plik cookie, który ustawiam, jest tracony bezpośrednio po wywołaniu metody RedirectToAction(). Czy za kulisami dzieje się coś, co unieważnia bieżące żądanie i tworzy nowe, które powoduje utratę pliku cookie, zanim zostanie utrwalony na dysku?Plik cookie nie jest zachowywany w MVC

Rozumiem, że jeśli chcesz, aby dane były dostępne po przekierowaniu, musisz użyć TempData, ale czy to samo dotyczy plików cookie? Jeśli tak, czy nie jest to brzydkie, aby przechowywać wartość cookie w TempData, a następnie zapisać plik cookie?

Aktualizacja:

zdałem sobie sprawę, że plik cookie jest tracona na koniec wniosek, że nie ma znaczenia, czy mam zadzwonić RedirectToAction(). Tak więc teraz pytanie brzmi: dlaczego ciasteczko nie zachowuje dwóch żądań? (I zaktualizować kod poniżej, aby zobaczyć, co robię teraz)

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

    return View("SomeView"); 

} 

Aktualizacja

stworzyłem nowy projekt MVC przy użyciu domyślnego szablonu. Zmodyfikowałem akcję HomeController/Index, aby uzyskać poniższy kod. Za pierwszym razem, gdy kliknęło się na widok "Plik Cookie Not Found", wydrukowano zgodnie z oczekiwaniami. Jednak za każdym razem drukowana jest ta sama wiadomość. Jeśli usunę linię, która określa datę wygaśnięcia, wszystko działa dobrze. Domyślam się, że prawdziwe pytanie brzmi: dlaczego tworzenie pliku cookie jest trwałe, ponieważ przeglądarka go wyrzuca? Czy istnieje sztuczka polegająca na uporaniu się z ciasteczkami w 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(); 
    } 

Odpowiedz

5

Powodem że

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

nie działa jest to, że ustawia cookie ze związkiem wygasa w przeszłości (przynajmniej dla mnie).

To działa, kiedy go zmienić na

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

Ustawianie cookie wygasa obiekt do przeszłości usunie cookie.

Ten kod działa dla mnie:

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

Późno w nocy zdałam sobie sprawę, że gdybym zmienił drugą próbkę do DateTime.UtcNow .AddDays (3); to działało. Nadal nie jestem pewien, dlaczego mój pierwszy przykład nie zadziała dla mnie. Myślę, że moim pierwotnym problemem była wartość, którą zapisywałem - to nie "Jarified", ale znacznie dłuższy ciąg. Zastanawiam się, czy data wygaśnięcia powoduje, że długość przekracza 4K. Dziękuję za odpowiedź! – Joe

0

Oto jedna wkładka na ustawienie plików cookie i datę ważności

Response.Cookies.Add(new HttpCookie("myCookie", "cookie value") 
    { Expires = DateTime.Now.AddDays(1)}); 
Powiązane problemy