7

基于此处的答案:如何将布尔值写入/读取 cookie?,我正在尝试实现 cookie 读/写代码。

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

@{
    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=Unable to cast object类型为 'System.Web.HttpCookie' 以键入 'System.IConvertible'。Source=mscorlib StackTrace: at System.Convert.ToBoolean(Object value) at ASP._Page_About_cshtml.Execute() in c:\DuckbilledPlatypi\About.cshtml:第 27 行 . . . 内部异常:

这是 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 执行器) +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 ] System.Convert.ToBoolean(对象值) +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 ] System.Convert.ToBoolean(对象值) +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 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 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 NET 框架版本:4.0.30319;ASP.NET 版本:4.0.30319.18033 NET 框架版本: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。或者,更确切地说,没有设置 vals:取消选中一个框后,所有 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值的名称相同不是问题,是吗?

4

2 回答 2

1

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

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

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

于 2013-05-27T14:37:47.457 回答