【问题标题】:Session Objects not Updating ASP.NET会话对象不更新 ASP.NET
【发布时间】:2011-02-13 02:15:31
【问题描述】:

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

Session("my_name") = "Dave"

稍后在我的代码中,我让用户有机会更新这个对象:

Session("my_name") = TextBox1.Text

我重新加载我的页面并显示如下的小问候语句:

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

无论我如何更改 Session("my_name"),结果都是:“Hello Dave”。

编辑:这是我编写的完整代码隐藏:

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

结束类

【问题讨论】:

  • 您需要提供完整的代码隐藏,以便任何人确定您的问题所在。
  • 当您在 Session("my_name") = Textbox1.Text 上设置断点时,它会更新吗?
  • 您的 Page_Load 中有 Session("my_name") = "Dave" 吗?
  • @Germ - 它是,但在 If..Then Page.IsPostBack=False 子句中
  • @Jack 当我在调试器的 autos 部分向下钻取到 Session-->Container-->System.Web.SessionState.HttpSessionStateContainer-->Item 它说,“为了评估一个索引属性,该属性必须是合格的,并且参数必须由用户显式提供。所以我也看不到它设置了什么?

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


【解决方案1】:

这对我有用:

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

【讨论】:

    【解决方案2】:

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

    要设置会话默认尝试...

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

    现在您可以使用会话变量而无需测试它是回发还是回调的一部分。

    【讨论】:

      【解决方案3】:

      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 Page Life Cycle Overview。

      【讨论】:

      • Venemo - 感谢您的回答。我认为您在按钮单击事件之前触发页面加载是正确的...但是我不明白您在后半部分中说“或进入按钮的单击事件”时的确切含义-不是吗我已经在做的事情和你刚才说的事情直到 page_load 之后才会发生?
      • 不,我的意思是你应该在按钮的点击事件中设置标签的文本。您当前正在将其设置在 Page_Load 中。但是,如果您将 session 用于不那么琐碎的情况,我当然会推荐页面的 PreRender 事件。 (我编辑了我的帖子以澄清。)
      • 感谢您的帮助。这个问题一直困扰着我……现在似乎已经解决了。
      【解决方案4】:

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

      【讨论】:

      • Ugg,我的回答太慢了,@Venemo 回答得很好:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2017-08-17
      • 2016-01-05
      • 1970-01-01
      • 2011-02-08
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多