質問
Cookieを設定する次のコードがあります:
string locale = ((DropDownList)this.LoginUser.FindControl("locale")).SelectedValue;
HttpCookie cookie = new HttpCookie("localization",locale);
cookie.Expires= DateTime.Now.AddYears(1);
Response.Cookies.Set(cookie);
ただし、Cookieを読み取ろうとすると、値はNullです。 Cookieが存在します。チェックすると、次のことは決してありません。
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
ヘルプ?
解決
チェックバックはポストバック後に行われますか?その場合は、代わりにRequestコレクションからCookieを読み取る必要があります。
CookieはResponse.Cookiesに追加することでブラウザーに保持され、Request.Cookiesから読み戻されます。
Responseに追加されたCookieは、ページが同じリクエストにある場合にのみ読み取ることができます。
他のヒント
最も可能性の高い答えは、この投稿
ReqestではなくResponseオブジェクトを使用してCookieの存在を確認しようとすると、ASP.netは自動的にCookieを作成します。
編集:注として、ASP.NETがCookie APIによって悪夢を引き起こすCookieの存在を確認する必要があるソフトウェアを作成することになりました。リクエストからCookieを取得して状態オブジェクトを作成する変換プロセスを作成することになりました。要求の最後に、状態オブジェクトをCookieに変換し、応答に入れます(必要な場合)。これにより、応答にCookieが含まれているかどうかを判断し、代わりに更新して、無意味なCookieの作成などを回避しようとすることが軽減されました。
疲れた<!> quot; Request <!> quot; <!> quot; Response <!> quotの代わりのコレクション。コレクション?
if (Request.Cookies["localization"] != null && !string.IsNullOrEmpty(Request.Cookies["localization"].Value))
私は答えを知っていると思います。
<form>
タグのaction属性を削除するだけです。
次のようにします:<form id="form1" runat="server">
これの代わりに:<form id="form1" action="DisplayName.aspx" runat="server">
コードでResponse.Redirect("DisplayName.aspx");
を使用する必要があります。
デバッグモードでコンパイルしている場合は、問題のページのトレースをオンにして、Cookieがリクエストコレクションにあることを確認します。 aspxファイルの@pageディレクティブでトレースを設定します。
このスニペットを試してください-
string locale = ((DropDownList)this.LoginUser.FindControl("locale"))
.SelectedValue;
HttpCookie myCookie = new HttpCookie("localization");
Response.Cookies.Add(myCookie);
myCookie.Values.Add("locale", locale);
Response.Cookies["localization"].Expires = DateTime.Now.AddYears(1);
<!> amp;読む-
if (Request.Cookies["localization"] != null)
{
HttpCookie cookie = Request.Cookies["localization"];
string locale = cookie.Values["locale"].ToString();
}
同様の問題が発生しました。ポストバック時にCookieを読み取ることができませんでした。私にとっての問題は、CookieのSecureプロパティをtrueにチェックしたことです。 CookieのSecureプロパティをオンにすると、接続でSecure Sockets Layerが使用されている場合にのみ、Cookieが送信されると言われています。ただし、SSLで送信していないことを考えると、ブラウザーで初めてCookieをどのように表示できたかはわかりませんが、ポストバックではわかりません。とにかく、cookie.secureをfalseに変更して問題を解決し、ポストバックでcookieを読み取らせました。
これで問題を解決する必要がない場合は申し訳ありませんが、これを共有したいと思いました。
これをChris Marisicの答えへのコメントとして追加しますが、その特権はありません:-(
ChrisがリクエストからCookieを削除することについての編集で述べたことに加えて、ポストバックで新しく作成されたCookieの値を読み取れるようになりました
Private Sub SetPageSize(ByVal pageSize As Integer)
' Set cookie value to pageSize
Dim pageSizeCookie As HttpCookie = New HttpCookie(pageSizeCookieName)
With pageSizeCookie
.Expires = Now.AddYears(100)
.Value = pageSize.ToString
End With
' Add to response to save it
Me.Response.Cookies.Add(pageSizeCookie)
' Add to request so available for postback
Me.Request.Cookies.Remove(pageSizeCookieName)
Me.Request.Cookies.Add(pageSizeCookie)
End Sub
Request.Cookies.RemoveおよびRequest.Cookies.Add行は、ポストバックで機能するようにします
Use Response.Cookies.Add(cookie); Response.Cookies.Set(cookie);の代わりに