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

时间:2013-05-27 14:35:35

标签: html asp.net html5 cookies razor

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

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

@{
    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 Message =无法将“System.Web.HttpCookie”类型的对象强制转换为“System.IConvertible”。   来源= mscorlib程序   堆栈跟踪:        at System.Convert.ToBoolean(Object value)        at ASP._Page_About_cshtml.Execute()in c:\ DuckbilledPlatypi \ About.cshtml:第27行 。 。 。的InnerException:

这是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(Object value)+18    ASP._Page_About_cshtml.Execute()在c:\ DuckbilledPlatypi \ About.cshtml:27    System.Web.WebPages.WebPageBase.ExecutePageHierarchy()+197    System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors)+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

他们只有出现才能正常工作,因为用于设置它们的字符串不匹配,而用于恢复它们的字符串不匹配。我现在已将bools的默认值从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值。或者更确切地说,没有设置val:取消选中一个框后,所有cookie都是“True”,而未选中的cookie应该是false ...

我做了另一次尝试 - 因为我看到其中一个cookie(secure_session)的值为“true” - 添加此代码以防案例很重要:

if (IsPost)
{
    Response.Cookies["selectTwitter"].Value = twitterSelected.ToString().ToLower();
. . .
再一次,唉,在Mudville没有任何喜悦:强大的案例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值的名称相同,不是吗?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

由于错误试图告诉您,selectTwitterCookie是一个HttpCookie实例,其中包含有关Cookie的信息。

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

您可能需要Value属性,该属性返回一个包含cookie实际值的字符串。