Можно ли установить куки в событии OnInit и прочитать их на той же странице? - PullRequest
1 голос
/ 20 февраля 2010

Я создаю живой макет для клиентского веб-сайта, и у меня возникают некоторые проблемы с получением дизайна.

В мастере сайта есть меню с несколькими категориями, но все они содержат похожий контент. Мне нужно меню, чтобы вспомнить, какой из них был выбран. Поэтому я попытался установить файл 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;
}

А по ссылкам просто позвоните IsSelected с именем "category1", "category2" и т. Д.

<li class="menu<%=IsSelected("category1") %>"><a href="/Category1.aspx">

Моя проблема в том, что cookie всегда находится позади страницы. Если я перейду из категории 1 в категорию 2, категория 1 останется выделенной. Если я продолжу к категории 3, теперь категория 2 будет выделена.

Чего я не понимаю, так это того, что когда я устанавливаю точки останова, значение cookie задается на правильной странице, но читается неправильно. Могу ли я вообще этого не делать?

Может кто-нибудь сказать мне, что не так или способ исправить это?

Ответы [ 4 ]

2 голосов
/ 20 февраля 2010

Все файлы cookie, которые вы добавляете / удаляете, будут доступны / удалены только при следующем запросе. Это связано с тем, что файлы cookie принадлежат клиентскому браузеру, а HttpContext.Current.Response.Cookies возвращает файлы cookie, которые приходят с текущим запросом.
Рассмотрите возможность использования Session или HttpContext.Current.Items для этой задачи.

1 голос
/ 20 февраля 2010

Обработка файлов cookie не изменилась так сильно, как я за 7 лет, с тех пор как я написал это:

http://www.codeproject.com/KB/aspnet/aspnetcookies.aspx?df=100&forumid=13312&exp=0&fr=26

1 голос
/ 20 февраля 2010

Вы (правильно) добавляете куки в коллекцию Response.Cookies во время OnInit, но ваше свойство IsSelected проверяет Request.Cookies. Добавление файла cookie к ответу автоматически не добавляет его и к текущему запросу (насколько я знаю).

Вы пытались найти файл cookie selectedCategory в Request.Cookies и Response.Cookies, чтобы обработать особый случай, когда файл cookie установлен в текущем запросе? Я на самом деле не уверен, что это сработает, но, может быть, стоит попробовать?

1 голос
/ 20 февраля 2010

Один из способов - возможно, не самый лучший - поделиться некоторыми данными по текущему запросу - это использовать контейнер httpRequest.Context.Current.Items. Затем вы можете вытащить свои значения, которые вы хотите, чтобы en-cookie-ize где-то в конце обработки вашего запроса (возможно, PostRender? Это даже событие?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...