基于此处的答案:如何将布尔值写入/读取 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值的名称相同不是问题,是吗?