【问题标题】:Cookie not being persisted in MVCCookie 未保留在 MVC 中
【发布时间】:2012-04-20 01:17:36
【问题描述】:

我遇到的问题是,我正在设置的 cookie 在调用 RedirectToAction() 后直接丢失。幕后发生的事情是否使当前请求无效并创建一个新请求,导致 cookie 在持久化到磁盘之前丢失?

我了解,如果您希望数据在重定向后可用,您需要使用 TempData,但对于 cookie 是否也一样?如果是这样,必须将 cookie 值存储在 TempData 中,然后再写入 cookie,这不是很丑吗?

更新:

我刚刚意识到cookie在请求结束时丢失了,如果我调用RedirectToAction()也没关系。所以现在的问题是为什么 cookie 不会持续存在两个请求? (我更新了下面的代码以显示我现在在做什么)

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

   return View("SomeView");

}

更新

我使用默认模板创建了一个新的 MVC 项目。我修改了 HomeController/Index 操作以具有以下代码。我第一次点击视图“未找到 Cookie”时按预期打印。但是,以后每次都会打印相同的消息。如果我删除设置到期日期的行,那么一切正常。我想这里真正的问题是为什么使 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();
    }

【问题讨论】:

    标签: asp.net-mvc debugging


    【解决方案1】:

    原因

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

    不起作用是因为它设置了一个在过去过期的 cookie(至少对我而言)。

    当我将其更改为时它可以工作

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

    将 cookie expires 属性设置为过去将删除 cookie。

    此代码适用于我:

        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();
        }
    

    【讨论】:

    • 昨晚深夜我意识到如果我将第二个样本更改为 DateTime.UtcNow.AddDays(3);它正在工作。我仍然不清楚的是为什么我的第一个例子对我不起作用。我认为我最初的问题是我存储的值-它不是“Jarified”而是更长的字符串。我想知道到期日期是否导致长度超过 4K。感谢您的回答!
    【解决方案2】:

    看看这篇文章。它应该可以解决您的问题!

    http://stephenwalther.com/blog/archive/2008/07/08/asp-net-mvc-tip-15-pass-browser-cookies-and-server-variables-as-action-parameters.aspx

        var newCookie = new HttpCookie("myCookie", cookieValue);
        newCookie.Expires = DateTime.Now.AddDays(10);
        Response.AppendCookie(newCookie);
        return RedirectToAction("Index");
    

    【讨论】:

      【解决方案3】:

      这是用于设置 cookie 和到期日期的单行代码

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-04
        • 2011-02-12
        • 2015-02-14
        • 2017-07-24
        • 1970-01-01
        • 2015-07-14
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多