基于这里的答案:如何将 bool 值写入 cookie 或从 cookie 读取 bool 值? https://stackoverflow.com/questions/16765467/how-can-i-write-and-read-bool-values-into-from-cookies,我正在尝试实现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=无法将“System.Web.HttpCookie”类型的对象转换为“System.IConvertible”类型。
来源=mscorlib
堆栈跟踪:
在 System.Convert.ToBoolean(对象值)
在 c:\DuckbilledPlatypi\About.cshtml 中的 ASP._Page_About_cshtml.Execute() 处:第 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(对象值) +18
c:\DuckbilledPlatypi\About.cshtml 中的 ASP._Page_About_cshtml.Execute():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
那么如何才能成功保存和恢复复选框的状态呢?
UPDATE
改变这个:
twitterSelected = Convert.ToBoolean(selectTwitterCookie);
...对此:
twitterSelected = Convert.ToBoolean(selectTwitterCookie.Value);
...摆脱了错误消息,但仍然没有恢复我保存的值(选中状态)。
UPDATE 2
奇怪的是,其中两个复选框现在正在工作(我选中的两个仍然处于选中状态)。到目前为止,为什么其他代码不这样做还是一个谜——它们的代码都是相同的,或者至少到目前为止看起来是相同的。我必须更深入地挖掘...
UPDATE 3
他们只appeared无法正常工作,因为用于设置它们的字符串与用于恢复它们的字符串不匹配。我现在已将布尔值的默认值从 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" [email protected] /cdn-cgi/l/email-protection()>I'm Twitterpated!</input><br />
<input type="checkbox" id="selectTwitter" name="selectTwitter" checked="@twitterSelected">I'm Twitterpated!</input><br />
UPDATE 4
我什至尝试过这个:
<input type="checkbox" id="selectTwitter" name="selectTwitter" [email protected] /cdn-cgi/l/email-protection(twitterSelected)>I'm Twitterpated!</input><br />
...但它没有任何差异 - 复选框根本不会尊重 cookie 值。或者,更确切地说,vals 没有被设置:取消选中一个框后,所有 cookie 都是“True”,而未选中的应该是 false...
我所做的另一次尝试 - 因为我看到其中一个 cookie (secure_session) 的值为“true” - 是添加此代码以防情况很重要:
if (IsPost)
{
Response.Cookies["selectTwitter"].Value = twitterSelected.ToString().ToLower();
. . .
……唉,穆德维尔再一次没有欢乐:强大的凯西已经出局了。
UPDATE 5
问题出在我的逻辑中:IsPost 部分/事件/条件没有将 cookie 值设置为当前现实(复选框的选中状态)。
我通过在“if (IsPost) {}”部分中强制 val 进行测试:
Response.Cookies["selectTwitter"].Value = "false";
...而且效果很好。但如何制作呢really工作仍然是一个难题。是否有一个 jQuery“httppost”事件,我可以根据复选框的状态设置所有 cookie?或者是否有一个 checkboxChange 或 -Toggle 事件,我可以在其中设置“this”复选框的 cookie 值?
UPDATE 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 值的名称相同不是问题,不是吗?