我正在为客户端网站创建一个实时模型,我在使设计工作时遇到了一些问题。
网站管理员有一个包含多个类别的菜单,但它们都包含类似的内容。我需要菜单来记住选择了哪一个。所以我尝试设置一个cookie来记住上次访问的类别,并为用户保留突出显示的类别。 (我知道这可能不是正确的方法,但它是一个模型,我只是想完成它。蛮力是可以接受的。)
这是我在主页上内省的令人难以置信的错误代码:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
switch (Path.GetFileNameWithoutExtension(HttpContext.Current.Request.Url.AbsolutePath).ToLower())
{
case "category1":
HttpContext.Current.Response.Cookies.Add(new HttpCookie("selectedCategory", "category1"));
break;
case "category2":
HttpContext.Current.Response.Cookies.Add(new HttpCookie("selectedCategory", "category2"));
break;
...
case "default":
HttpContext.Current.Response.Cookies.Add(new HttpCookie("selectedCategory", "category1"));
break;
}
}
// filePath will be "category1", "category2", etc.
public string IsSelected(string filePath)
{
return String.Compare(HttpContext.Current.Request.Cookies["selectedCategory"].Value, filePath, true) == 0
? " selected" // The class name to add to the CSS
: String.Empty;
}
链接只需使用名称“category1”,“category2”等调用IsSelected
。
<li class="menu<%=IsSelected("category1") %>"><a href="/Category1.aspx">
我的问题是,cookie始终是一个页面。如果我从category1转到category2,则category1保持突出显示。如果我继续使用category3,则会突出显示category2。
我不明白的是,当我设置断点时,cookie值被设置为正确的页面,但它被错误读出。我可以不这样做吗?
任何人都可以告诉我有什么问题或解决方法吗?
答案 0 :(得分:2)
您添加/删除的所有Cookie仅在下次请求时可用/删除。这是因为cookie属于客户端浏览器,而HttpContext.Current.Response.Cookies返回当前请求附带的cookie。
考虑使用Session或HttpContext.Current.Items来完成此任务。
答案 1 :(得分:1)
在当前请求上共享某些数据的一种方法 - 可能不是最好的方法 - 是使用httpRequest.Context.Current.Items容器。然后你可以在你的请求处理结束时把你想要的值(你想要PostRender吗?这甚至是一个事件?)
答案 2 :(得分:1)
您在Response.Cookies
期间(正确)将Cookie添加到OnInit
集合,但您的IsSelected
属性会检查Request.Cookies
。在响应中添加cookie并不会自动将其添加到当前请求中(据我所知)。
您是否尝试在selectedCategory
和Request.Cookies
中查找Response.Cookies
Cookie,以便在当前请求中设置Cookie时处理特殊情况?我实际上不确定这会起作用,但也许值得一试?
答案 3 :(得分:1)
自从我写这篇文章以来的7年里,Cookie处理的变化并没有变化:
http://www.codeproject.com/KB/aspnet/aspnetcookies.aspx?df=100&forumid=13312&exp=0&fr=26