【问题标题】:.NET MVC 5 Reset cookie upon page load.NET MVC 5 在页面加载时重置 cookie
【发布时间】:2017-07-21 03:00:08
【问题描述】:

我有一个奇怪的问题,我尝试像这样在 Razor 视图中设置 cookie 值:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    HttpCookie e = new HttpCookie("d");
    e.Value = @Url.RequestContext.RouteData.Values["id"].ToString();
    e.Expires = DateTime.Now.AddMonths(999); // expires after 30 days
    Response.Cookies.Add(e);
}

然后我根据这个 cookie 值形成 URL,如下所示:

@foreach(//some collection)
{
  <a href="/Items/Index/@Request.Cookies["d"].Value"></a>
}

假设第一个路由 id 值为:

user123

以及下一个路由id值:

user1234

当页面首次加载时,链接如下所示:

/Items/Index/user123

当我第二次传递路由 id 值时,user1234 链接仍然保持不变,例如:

/Items/Index/user123

只有第三次刷新页面时,URL 才会更改为:

/Items/Index/user1234

我想在每次页面加载时将 cookie 值设置为一个新值,然后根据存储在 cookie 中的路由 id 值形成 url...

我在这里做错了什么?

【问题讨论】:

    标签: c# asp.net asp.net-mvc razor cookies


    【解决方案1】:

    这里没有什么奇怪的。想想流程:

    第一次加载视图时,id 为 user123。引擎执行响应并使用该值创建 cookie。 cookie 将与 response 一起使用,但仅在 next request 时可用。

    在 ID 为 user1234 的第二个 request 中,cookie 现在可用,其值来自最后一个 response (user123),所以你明白了在您的链接中,尽管您现在将其设置为 response 中的下一个值 (user1234)。

    换句话说,您总是落后一步,因为您试图同时设置 cookie 和读取 cookie。要设置 cookie,必须先将其发送回浏览器,以便在后续请求中可用。

    您可以通过首先检查 cookie 是否存在来解决此问题。如果没有,请使用路由数据中的值生成链接并设置 cookie,否则使用 cookie 中的值生成链接。

    【讨论】:

    • 我应该把它付诸行动吗?或者有什么解决方法?
    • @User987:我更新了我的答案,让你知道如何解决这个问题。
    • 好的,但是当cookie确实存在并且路由ID保持不变时呢?
    • 在不知道自己在做什么的情况下,在我看来,您正试图通过路线数据识别用户,然后从那里保存身份,对吧?如果是这种情况,我建议将 cookie 设置代码移动到控制器库或属性中,并将链接的生成留给视图。
    • 好吧,我解决了,我只是最初使用路由值 id,然后在其他页面上使用 cookie 值..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多