是否可以在OnInit事件中设置cookie并在同一页面上读取它们?

时间:2010-02-19 23:11:03

标签: c# asp.net cookies webforms

我正在为客户端网站创建一个实时模型,我在使设计工作时遇到了一些问题。

网站管理员有一个包含多个类别的菜单,但它们都包含类似的内容。我需要菜单来记住选择了哪一个。所以我尝试设置一个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值被设置为正确的页面,但它被错误读出。我可以不这样做吗?

任何人都可以告诉我有什么问题或解决方法吗?

4 个答案:

答案 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并不会自动将其添加到当前请求中(据我所知)。

您是否尝试在selectedCategoryRequest.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