簡體   English   中英

會話對象不更新ASP.NET

[英]Session Objects not Updating ASP.NET

我在代碼的一個時刻設置了一個會話對象:

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

結束班

PageLoad事件比Button的click事件更早啟動。 因此,在運行時, Session("my_name")值仍然是“Dave”。

如果您想正確設置它,您應該將Label1.Text = CStr(Session("my_name"))放入頁面的PreRender事件處理程序中。

你也把它切換到ButtonClick事件中(當然,在設置了會話值之后),但我想你以后想要使用會話來存儲對象,以達到不太重要的目的。

(我想你以后想把這個會話用於更高級的目的。畢竟,如果你只想更改標簽的文本,那么使用會話會有什么意義?)

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

  • 如果不是回發,則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.LoadButton1_Click之前運行 - 因此您將文本框的值設置為會話中的任何內容,然后稍后獲取該文本框的內容(已經覆蓋)並將其彈回到會話中。

您沒有正確設置Session變量的默認值。 基本上你是在每個頁面加載時將會話變量設置為'Dave'而不是回發。 這甚至包括回調和頁面重新加載。

要設置會話默認嘗試...

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

現在,您可以使用會話變量而不進行測試,如果它是Postback或Callback的一部分。

這對我有用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM