【问题标题】: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值的名字一样不是问题吧?

【问题讨论】:

    标签: asp.net html cookies razor


    【解决方案1】:
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 2010-10-12
      • 2014-01-03
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多