.NET MVC 5在页面加载时重置cookie

时间:2017-07-20 18:41:46

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

我有一个奇怪的问题,我尝试在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

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

/Items/Index/user1234

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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

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

视图第一次加载id user123。引擎执行响应并使用此值创建cookie。 Cookie将与响应一起使用,但只能在下一个 请求上使用。

在ID为user1234的第二个请求上,Cookie现已可用,其值为上一个响应user123),因此,您可以在链接中获取该内容,但现在将其设置为响应中的下一个值(user1234)。

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

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