为啥我的 cookie 设置没有被应用?
Posted
技术标签:
【中文标题】为啥我的 cookie 设置没有被应用?【英文标题】:Why are my cookie settings not being applied?为什么我的 cookie 设置没有被应用? 【发布时间】:2013-05-22 10:38:46 【问题描述】:根据这里的答案:How can I write and read bool values into/from cookies?,我正在尝试实现 cookie 读取/写入代码。
我在一个页面上有一系列复选框,它们的选中状态应该保存到/作为cookies;当页面[重新]加载时,最后一个状态应该通知复选框是否应该检查它们。但它不起作用。以下是页面的相关部分:
@
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 处理消息=无法将“System.Web.HttpCookie”类型的对象转换为“System.IConvertible”类型。 源=mscorlib 堆栈跟踪: 在 System.Convert.ToBoolean(对象值) 在 c:\DuckbilledPlatypi\About.cshtml:line 27 中的 ASP._Page_About_cshtml.Execute() . . .内部异常:"
这里是 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:27 中的 ASP._Page_About_cshtml.Execute() 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
那么如何才能成功保存和恢复复选框的状态呢?
更新
改变这个:
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。或者,更确切地说,没有设置 val:取消选中一个框后,所有 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值的名字一样不是问题吧?
【问题讨论】:
【参考方案1】:我从 http://forums.asp.net/p/1910373/5408967.aspx/1?Re+How+can+I+access+html+elements+in+the+IsPost+section+of+the+razor+code+ 的 Mike "Mikesdotnetting" Brind 那里得到了答案
【讨论】:
【参考方案2】:正如错误试图告诉您的那样,selectTwitterCookie
是一个 HttpCookie
实例,其中包含有关 cookie 的信息。
将其转换为布尔值是没有意义的。
您可能需要Value
属性,它返回一个带有cookie 实际值的字符串。
【讨论】:
以上是关于为啥我的 cookie 设置没有被应用?的主要内容,如果未能解决你的问题,请参考以下文章