2017-07-20 18 views
0

私はカミソリでクッキーの値を設定しようとする奇妙な問題は、このようなビューがあります。.NET MVC 5リセットクッキー

@{ 
    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); 
} 

そして私のようなこのクッキー値に基づいてURLを形成しますこの:

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

それでは、最初のルートIDの値があったとしましょう:

user123 

そして、次のルートid値:

user1234 

ページのロードが初めてリンクは次のようになります。

/Items/Index/user123 

:user1234リンクはまだ同じように残っているとして2回目は、私は、ルートid値を渡すと

/Items/Index/user123 

3回目にページを更新すると、URLは次のように変更されます。

/Items/Index/user1234 

私は、ページが読み込まれ、Cookieに格納されているそのルートID値に基づいてURLを形成するたびに新しい値にクッキー値を設定したいと思います...

私はここで間違っていますか?

答えて

1

ここには何も変わりありません。フローについて考えてみましょう:

ビューは初めてID user123でロードされます。エンジンは応答を実行し、この値を持つクッキーを作成します。クッキーはレスポンスとなりますが、次のリクエストでのみ利用可能です。 ID user1234を有する第二要求

は、クッキーが最後応答user123)からの値で、現在利用可能であるので、あなたが今、次にそれを設定しているが、あなたは、あなたのリンクであることを取得しますレスポンスの値(user1234)です。

つまり、Cookieを設定してCookieを同時に読み取ろうとすると、常に一歩手間がかかります。クッキーを設定するには、最初にブラウザに送り返す必要があります。そのため、後続のリクエストで利用できるようになります。

これは、クッキーが存在するかどうかを最初に確認することで解決できます。そうでない場合は、ルートデータに含まれる値を使用してリンクを生成し、Cookieを設定します。そうでなければ、Cookieの値を使用してリンクを生成します。

+0

私はむしろ実際にそれを設定する必要がありますか?または、回避策がありますか? – User987

+0

@ User987:これを修正する方法のアイデアを得るために私の答えを更新しました。 – JuanR

+0

OKですが、クッキーが存在し、ルートIDが同じであればどうなりますか? – User987

関連する問題