Объекты сеанса не обновляют ASP.NET - PullRequest
7 голосов
/ 28 апреля 2010

Я установил объект сеанса в один момент в моем коде:

Session("my_name") = "Dave"

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

Session("my_name") = TextBox1.Text

Я перезагружаю свою страницу и показываю небольшое приветственное заявление, например:

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

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

РЕДАКТИРОВАТЬ: Вот полный код, который я написал, чтобы продемонстрировать:

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

Конечный класс

Ответы [ 4 ]

7 голосов
/ 28 апреля 2010

Событие Page Load срабатывает раньше , чем событие щелчка Button. Следовательно, во время работы значение Session("my_name") по-прежнему равно «Dave».

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

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

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

По сути, вот что вы хотите:

  • Page_Load устанавливает для Session («my_name») значение «Dave», если это не постбэк
  • Button1_Click устанавливает Session ("my_name") в текстовое поле
  • Page_PreRender устанавливает текст метки.

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

  • Page_Load устанавливает для Session («my_name») значение «Dave», если это не обратная передача
  • Page_Load устанавливает текст метки
  • Button1_Click устанавливает Session ("my_name") в текстовое поле

Подробнее о теме можно прочитать здесь: Обзор жизненного цикла страницы ASP.NET .

3 голосов
/ 28 апреля 2010

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

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

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

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

3 голосов
/ 28 апреля 2010

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

0 голосов
/ 21 декабря 2018

вот что у меня сработало:

objectName objectInstance = Session["mySession"] as objectName; //offload
objectInstance.attributeToUpdate = true; //update
Session["mySession"] = objectInstance; //re-assign   
...