会话对象不更新ASP.NET

时间:2010-04-27 21:29:12

标签: .net asp.net session session-state session-variables

我在代码的一个关键点设置了一个会话对象:

Session("my_name") = "Dave"

稍后在我的代码中,我给用户一个更新此对象的机会:​​

Session("my_name") = TextBox1.Text

我重新加载我的页面并显示一个像这样的小问候语:

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

结果是:“Hello Dave”无论我改变Session(“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 个答案:

答案 0 :(得分:7)

Page的{​​{1}}事件比Load点击事件更快 。因此,在它运行时,Button的值仍为“Dave”。

如果您想正确设置,则应将Session("my_name")放入页面的Label1.Text = CStr(Session("my_name"))事件处理程序。

你也把它放到PreRender的{​​{1}}事件中(当然,在设置会话值之后),但我想你以后想要使用会话存储对象不那么琐碎的目的。

(我想你以后想要将会话用于更高级的目的。毕竟,如果你只想更改标签的文本,那么使用会话会有什么意义?)

基本上,这就是你想要的:

  • 如果不是回发,则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 Page Life Cycle Overview

答案 1 :(得分:3)

Page.LoadButton1_Click之前运行 - 因此您将文本框的值设置为会话中的任何内容,然后稍后获取该文本框的内容(您已经拥有该文本框)覆盖)并将其弹回会话。

答案 2 :(得分:3)

您未正确设置会话变量默认值。基本上你是在每个页面加载时将会话变量设置为'Dave'而不是回发。这甚至包括回调和页面重新加载。

设置会话默认尝试...

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

现在,您可以使用会话变量而不进行测试,如果它是回发或回调的一部分。

答案 3 :(得分:0)

这对我有用:

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