2009-06-30 8 views
5

У меня возникла проблема, когда cookie, который я устанавливаю, теряется сразу после вызова RedirectToAction(). Что-то происходит за кулисами, что делает недействительным текущий запрос и создает новый, который заставляет cookie быть потерянным, прежде чем он будет сохранен на диске?Cookie не сохраняется в MVC

Я понимаю, что если вы хотите, чтобы данные были доступны после перенаправления, вам нужно использовать TempData, но это то же самое для файлов cookie? Если да, то не кажется ли уродливым хранить значение cookie в TempData, а потом писать cookie позже?

Update:

Я просто понял, что печенье теряется в конце запроса, это не имеет значения, если я называю RedirectToAction(). Итак, теперь вопрос заключается в том, почему куки-файлы сохраняют два запроса? (Я обновляю код ниже, чтобы показать, что я делаю сейчас)

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

    return View("SomeView"); 

} 

Update

Я создал новый проект MVC, используя шаблон по умолчанию. Я изменил действие HomeController/Index, чтобы иметь код ниже. В первый раз, когда я попал в точку зрения «Cookie Not Found», печатается, как и ожидалось. Однако каждый последующий момент печатается одно и то же сообщение. Если я удалю строку, которая устанавливает дату истечения срока действия, тогда все будет хорошо. Я предполагаю, что реальный вопрос заключается в следующем: почему постоянство cookie заставляет браузер отбрасывать его? Есть ли уловка для создания файлов cookie в 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(); 
    } 

ответ

5

Причина, по которой

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

не работает в том, что она устанавливает печенье с истекает в прошлом (по крайней мере для меня).

Это работает, когда я изменить его на

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

Установка куки истекает свойство в прошлое удалит куки.

Этот код работает для меня:

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

В конце прошлой ночью я понял, что если я изменил второй образец DateTime.UtcNow .AddDays (3); он работал. Я еще не понимаю, почему мой первый пример не работает для меня. Я думаю, что была моя первоначальная проблема - это значение, которое я хранил - это не «Ярифицированный», а гораздо длиннее. Интересно, истекает ли срок годности более 4K. Спасибо за ответ! – Joe

0

Вот один вкладыш для установки печенья и дату истечения срока действия

Response.Cookies.Add(new HttpCookie("myCookie", "cookie value") 
    { Expires = DateTime.Now.AddDays(1)}); 
Смежные вопросы