我有一个奇怪的问题,我尝试在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 ...
我在这里做错了什么?
答案 0 :(得分:1)
这里没有什么奇怪的。想想流程:
视图第一次加载id user123
。引擎执行响应并使用此值创建cookie。 Cookie将与响应一起使用,但只能在下一个 请求上使用。
在ID为user1234
的第二个请求上,Cookie现已可用,其值为上一个响应(user123
),因此,您可以在链接中获取该内容,但现在将其设置为响应中的下一个值(user1234
)。
换句话说,你总是落后一步,因为你试图设置cookie并同时读取cookie。对于要设置的cookie,必须先将其发送回浏览器,以便后续请求可用。
您可以通过首先检查cookie是否存在来解决此问题。如果没有,请使用路径数据中的值生成链接并设置cookie,否则使用cookie中的值生成链接。