Объекты сессии, не Обновляющие ASP.NET

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

Session("my_name") = "Dave"

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

Session("my_name") = TextBox1.Text

Я перезагружаю свою страницу и отображаю немного привет оператор как это:

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

Результат: "Привет Dave" независимо от того, что я изменяю Сессию ("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

Класс конца

7
задан Venemo 21 May 2010 в 16:08
поделиться

3 ответа

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

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

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

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

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

  • 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 .

7
ответ дан 6 December 2019 в 15:20
поделиться

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

3
ответ дан 6 December 2019 в 15:20
поделиться

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

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

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

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

3
ответ дан 6 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: