为啥我的 cookie 设置没有被应用?

Posted

技术标签:

【中文标题】为啥我的 cookie 设置没有被应用?【英文标题】:Why are my cookie settings not being applied?为什么我的 cookie 设置没有被应用? 【发布时间】:2013-05-22 10:38:46 【问题描述】:

根据这里的答案:How can I write and read bool values into/from cookies?,我正在尝试实现 cookie 读取/写入代码。

我在一个页面上有一系列复选框,它们的选中状态应该保存到/作为cookies;当页面[重新]加载时,最后一个状态应该通知复选框是否应该检查它们。但它不起作用。以下是页面的相关部分:

@
    bool twitterSelected = false;
    . . .
    var selectTwitterCookie = Request.Cookies["selectTwitter"];
    . . .
    if (selectTwitterCookie != null)
    
        twitterSelected = Convert.ToBoolean(selectTwitterCookie);
    
    . . .

if (IsPost)

    Response.Cookies["selectTwitter"].Value = twitterSelected.ToString();
    Response.Cookies["selectTwitter"].Expires = DateTime.Now.AddYears(1);
    . . .

<section class="featured">
        <div class="content-wrapper">
           <h1>Stuff!!!</h1>
            <form method="POST">
                <fieldset>
                    <legend>Opt In or Out</legend>
                    <input type="checkbox" id="selectTwitter" name="selectTwitter" checked=@twitterSelected>I'm Twitterpated!</input><br />
                    <input type="submit" id="btnSubmit" name="btnSubmit" value="Save Config changes"</input>
                </fieldset>
            </form>
        </div>
    </section>

但是,不仅复选框没有恢复到我发布后保存的状态,在导航离开然后返回页面时,我得到,“System.InvalidCastException 未被用户代码 HResult=-2147467262 处理消息=无法将“System.Web.HttpCookie”类型的对象转换为“System.IConvertible”类型。 源=mscorlib 堆栈跟踪: 在 System.Convert.ToBoolean(对象值) 在 c:\DuckbilledPlatypi\About.cshtml:line 27 中的 ASP._Page_About_cshtml.Execute() . . .内部异常:"

这里是 YSOD:

“/”应用程序中的服务器错误。 无法将“System.Web.HttpCookie”类型的对象转换为“System.IConvertible”类型。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.InvalidCastException:无法将“System.Web.HttpCookie”类型的对象转换为“System.IConvertible”类型。 源错误: 第 25 行://bool.TryParse(selectTwitterCookie, out twitterSelected); 第 26 行://或者,可以使用: 第 27 行:twitterSelected = Convert.ToBoolean(selectTwitterCookie); 第 28 行: 第 29 行:if (selectBingCookie != null) 源文件:c:\DuckbilledPlatypi\About.cshtml 行:27 堆栈跟踪: [InvalidCastException:无法将“System.Web.HttpCookie”类型的对象转换为“System.IConvertible”类型。] System.Convert.ToBoolean(对象值)+18 c:\DuckbilledPlatypi\About.cshtml:27 中的 ASP._Page_About_cshtml.Execute() System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197 System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 执行者) +69 System.Web.WebPages.WebPage.ExecutePageHierarchy() +151 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76 System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext) +114 版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.18033

那么如何才能成功保存和恢复复选框的状态呢?

更新

改变这个:

twitterSelected = Convert.ToBoolean(selectTwitterCookie);

...到这个:

twitterSelected = Convert.ToBoolean(selectTwitterCookie.Value);

...摆脱了错误消息,但仍然没有恢复我保存的值(检查状态)。

更新 2

奇怪的是,其中两个复选框现在正在工作(我选中的两个仍然处于选中状态)。到目前为止,为什么其他人不这样做是一个谜——它们的代码都是相同的,或者至少到目前为止看起来是一样的。我将不得不深入挖掘......

更新 3

它们只是似乎在工作,因为用于设置它们的字符串不匹配,而用于恢复它们的字符串不匹配。我现在已将布尔值的默认值从 false 更改为 true,并且现在始终检查所有复选框(在发布/重新加载页面之后)。所以,我仍然不知道为什么以下不起作用:

bool twitterSelected = true;

var selectTwitterCookie = Request.Cookies["selectTwitter"];

if (selectTwitterCookie != null)

    twitterSelected = Convert.ToBoolean(selectTwitterCookie.Value);

. . .

if (IsPost)

    Response.Cookies["selectTwitter"].Value = twitterSelected.ToString();

                <input type="checkbox" id="selectTwitter" name="selectTwitter" checked=@twitterSelected>I'm Twitterpated!</input><br />

这些排列也不起作用:

<input type="checkbox" id="selectTwitter" name="selectTwitter" checked=@twitterSelected.ToString()>I'm Twitterpated!</input><br />
<input type="checkbox" id="selectTwitter" name="selectTwitter" checked="@twitterSelected">I'm Twitterpated!</input><br />

更新 4

我什至试过这个:

<input type="checkbox" id="selectTwitter" name="selectTwitter" checked=@Convert.ToBoolean(twitterSelected)>I'm Twitterpated!</input><br />

...但它没有区别 - 复选框根本不会尊重 cookie vals。或者,更确切地说,没有设置 val:取消选中一个框后,所有 cookie 都是“True”,而未选中的应该是 false...

我进行的另一次尝试——因为我看到其中一个 cookie (secure_session) 的值为“true”——添加此代码以防大小写很重要:

if (IsPost)

    Response.Cookies["selectTwitter"].Value = twitterSelected.ToString().ToLower();
. . .

...再次,唉,Mudville 没有欢乐:强大的 case-y 已经出局了。

更新 5

问题出在我的 [il] 逻辑中:IsPost 部分/事件/条件未将 cookie 值设置为当前现实(复选框的选中状态)。

我通过在“if (IsPost) ”部分中强制使用 val 进行测试:

Response.Cookies["selectTwitter"].Value = "false";

...它工作正常。但是如何让它真正发挥作用仍然是一个难题。是否有一个 jQuery“httppost”事件,我可以根据复选框的状态设置所有 cookie?或者是否有一个 checkboxChange 或 -Toggle 事件,我可以为“this”复选框设置 cookie val?

更新 6

我也试过这个:

if (IsPost)

    Response.Cookies["selectTwitter"].Value = Request["selectTwitter"]; //"false";
.  . .

        <form method="POST">
. . .
        <input type="checkbox" id="selectTwitter" name="selectTwitter" checked=@twitterSelected>I'm Twitterpated!</input><br />

...但还是不行;文本输入控件的名字/id和cookie值的名字一样不是问题吧?

【问题讨论】:

【参考方案1】:

我从 http://forums.asp.net/p/1910373/5408967.aspx/1?Re+How+can+I+access+html+elements+in+the+IsPost+section+of+the+razor+code+ 的 Mike "Mikesdotnetting" Brind 那里得到了答案

【讨论】:

【参考方案2】:

正如错误试图告诉您的那样,selectTwitterCookie 是一个 HttpCookie 实例,其中包含有关 cookie 的信息。

将其转换为布尔值是没有意义的。

您可能需要Value 属性,它返回一个带有cookie 实际值的字符串。

【讨论】:

以上是关于为啥我的 cookie 设置没有被应用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Chrome 没有收到我的 cookie?

为啥我的部分没有被发现?

为啥 Chrome 不能设置 cookie

为啥我的chrome不能自动记住cookie

为啥设置 document.cookie 在 Chrome 中不起作用?

为啥我在Servlet内设置Cookies无效?