我在代码的一个关键点设置了一个会话对象:
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
结束班
答案 0 :(得分:7)
Page
的{{1}}事件比Load
点击事件更快 。因此,在它运行时,Button
的值仍为“Dave”。
如果您想正确设置,则应将Session("my_name")
放入页面的Label1.Text = CStr(Session("my_name"))
事件处理程序。
你也把它放到PreRender
的{{1}}事件中(当然,在设置会话值之后),但我想你以后想要使用会话存储对象不那么琐碎的目的。
(我想你以后想要将会话用于更高级的目的。毕竟,如果你只想更改标签的文本,那么使用会话会有什么意义?)
基本上,这就是你想要的:
以下是您当前代码的内容:
您可以在此处详细了解该主题:ASP.NET Page Life Cycle Overview。
答案 1 :(得分:3)
Page.Load
在Button1_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