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

B. *_*non 7 html asp.net cookies html5 razor

基于这里的答案:我如何在cookie中写入和读取bool值?,我正在尝试实现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);
    . . .
}
Run Code Online (Sandbox Code Playgroud)

}

<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>
Run Code Online (Sandbox Code Playgroud)

但是,不仅复选框没有恢复到我发布后保存的状态,导航然后返回页面,我得到," System.InvalidCastException未被用户代码处理HResult = -2147467262 Message =无法转换对象类型为"System.Web.HttpCookie"的类型为'System.IConvertible'.来源= mscorlib StackTrace:位于System.Convert.ToBoolean(对象值)处的ASP._Page_About_cshtml.Execute()位于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()in 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

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

UPDATE

改变这个:

twitterSelected = Convert.ToBoolean(selectTwitterCookie);
Run Code Online (Sandbox Code Playgroud)

......对此:

twitterSelected = Convert.ToBoolean(selectTwitterCookie.Value);
Run Code Online (Sandbox Code Playgroud)

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

更新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 />
Run Code Online (Sandbox Code Playgroud)

这些排列也不起作用:

<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 />
Run Code Online (Sandbox Code Playgroud)

更新4

我甚至试过这个:

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

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

我做了另一次尝试 - 因为我看到其中一个cookie(secure_session)的值为"true" - 正在添加此代码,以防情况很重要:

if (IsPost)
{
    Response.Cookies["selectTwitter"].Value = twitterSelected.ToString().ToLower();
. . .
Run Code Online (Sandbox Code Playgroud)

......再一次,唉,莫德维尔没有任何喜悦:强大的情况已经消失了.

更新5

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

我通过在"if(IsPost){}"部分中强制执行val来测试:

Response.Cookies["selectTwitter"].Value = "false";
Run Code Online (Sandbox Code Playgroud)

......它工作正常.但如何让它真正发挥作用仍然是一个难题.是否有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 />
Run Code Online (Sandbox Code Playgroud)

......但仍然没有去; 问题是文本输入控件的名称/ id与cookie值的名称相同,不是吗?