2010-04-27 1 views
7

Я поставил объект сеанса на одном этапе в моем коде:сессии Объекты не Обновление ASP.NET

Session("my_name") = "Dave" 

Позже в моем коде я дать пользователю возможность обновить этот объект:

Session("my_name") = TextBox1.Text 

я перезарядить мою страницу и показать немного о привет как это:

Label1.Text = "Hello" & CStr(Session("my_name")) 

результат является: «Привет Дэйв», независимо от того, что я не изменить Ses sion («my_name»).

EDIT: Вот полный код-за я написал до демонстрируемых:

Public Class WebForm1 
Inherits System.Web.UI.Page 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Response.Cache.SetCacheability(HttpCacheability.NoCache) 
    Response.ExpiresAbsolute = DateTime.Now.AddMonths(-1) 
    If Page.IsPostBack = False Then 
     Session("my_name") = "Dave" 
    End If 
    Label1.Text = CStr(Session("my_name")) 
End Sub 

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
    Session("my_name") = TextBox1.Text 
End Sub 

End класса

+4

Вам нужно будет предоставить полную кодовую форму, чтобы кто-нибудь мог определить, где ваша проблема. –

+1

Когда вы устанавливаете точку перерыва в сеансе («my_name») = Textbox1.Text обновляет? –

+1

Есть ли сеанс («my_name») = «Dave» в вашей Page_Load? – Germ

ответ

7

Page 'Load пожаров событий с до раньше чем Button' мыши s мероприятие. Поэтому в момент его запуска значение Session("my_name") по-прежнему «Дейв».

Если вы хотите настроить его правильно, вы должны либо поместить Label1.Text = CStr(Session("my_name")) в обработчик событий PreRender на своей странице.

Вы вырезали его также в Click (после установки значения сеанса, конечно), но я предполагаю, что вы хотите использовать сеанс позже для хранения объектов для менее тривиальных целей.

(я предполагаю, что вы хотели бы использовать сессию для более продвинутых целей позже. В конце концов, что бы смысл использовать сессию, если вы хотите изменить только текст метки?)

В основном, вот то, что вы хотите:

  • Page_Load устанавливает сеанс («my_name»), чтобы «Дэйв», если это не постбэк
  • Button1_Click устанавливает сеанс («my_name») к тексту текстового поля в
  • Page_PreRender устанавливает текст метки.

Вот что происходит с вашим текущим кодом:

  • Page_Load устанавливает сеанс («my_name»), чтобы «Дэйв», если это не постбэк
  • Page_Load устанавливает текст лейбла
  • Button1_Click устанавливает сеанс («my_name») к тексту текстового поля в

Вы можете прочитать больше о теме здесь: ASP.NET Page Life Cycle Overview.

+0

Venemo - Спасибо за ответ. Думаю, вы правы запуск загрузки страницы раньше, чем событие нажатия кнопки ... но я не понимаю, что вы имеете в виду, когда говорите «или в событии Click на кнопке» во второй части, - это не то, что я уже делаю, что вы только что сказали, не происходит до тех пор, пока p age_load? – davemackey

+0

Нет, я хочу сказать, что вы должны установить текст метки в событии Click Button. Вы устанавливаете его в Page_Load в настоящее время. Но если вы используете сеанс для менее тривиального случая, я бы обязательно рекомендовал событие PreRender на странице. (Я отредактировал мое сообщение, чтобы уточнить.) – Venemo

+0

Спасибо за вашу помощь. Этот вопрос преследовал меня ... Кажется, теперь выясняется. – davemackey

3

Page.Load работает перед вашим Button1_Click - поэтому вы устанавливаете значение своего текстового поля на все, что у вас есть в сеансе, а затем немного позже, беря содержимое этого текстового поля (которое вы уже перезаписали) и вставляете его обратно в сессия.

+2

Ugg, слишком медленно с моим ответом, хорошо ответил @Venemo :) – slugster

3

Вы не устанавливаете переменную сеанса должным образом. В основном вы устанавливаете переменную сеанса на «Dave» на с каждой загрузкой страницы, которая не является обратной передачей. Это даже включает обратные вызовы и перезагрузку страниц.

Чтобы установить сеанс по умолчанию попробовать ...

if(String.IsNullOrEmpty(Session["my_name"])) 
{ 
    Session["my_name"] = "Dave"; 
} 

Теперь вы можете использовать переменный сеанс без тестирования, если это часть постбэка или обратного вызова.