2016-05-12 104 views
0

我遇到了一些我沒有想到的事情,並且有點困惑。也許這已經很長時間了,因爲我已經感覺到這一點,並忘記它是如何工作的。ASP.Net C#對象保存到會話後仍然存在一次

的基本概念是這樣的:

  1. 第一頁上創建一個對象,把它OBJ1(1版)
  2. 保存對象會話
  3. 檢索會話對象第2頁
  4. 更改對象現在稱爲obj1(版本2),但不保存到會話
  5. 從第3頁的會話檢索對象
  6. 顯示對象da ta

預期結果:我希望看到來自obj1(版本1)的數據。

準確的結果:我實際上看到obj1(版本2)的數據,儘管我沒有將更改的對象保存到會話中。

我已經創建了一個small project on GitHub,所以你可以看到我的意思。

+1

'更改對象page2'你怎麼樣改變對象?它是什麼類型的對象?我覺得你正在改變物體的屬性,這會產生你看到的結果。 – Jonesopolis

+0

@Jonesopolis,你可以在我提供的項目中看到我的男人。這是一個User對象,然後我改變屬性的值。根據你所說的話,對象會自動保存回會話中?或者當我從會話中檢索對象時,我所做的只是獲取指向該對象的指針? – RoLYroLLs

回答

0

讓我們分析一下source(見補充意見):

<script runat="server"> 
    private Model.User _user; 

    protected void Page_Load(object sender, EventArgs e) { 
     // _user is stored in the session, the *very same* object 
     _user = HttpContext.Current.Session[Model.Common.UserSessionNameValue] as Model.User; 

     if (_user == null) { 
      _user = new Model.User(); 
     } 

     var submit = Request.Form["Submit"] ?? String.Empty; 
     if (!String.IsNullOrWhiteSpace(submit)) { 
      var strUserId = Request.Form["UserId"] ?? String.Empty; 
      var userName = Request.Form["UserName"] ?? String.Empty; 
      var email = Request.Form["Email"] ?? String.Empty; 
      Int32 userId; 
      Int32.TryParse(strUserId, out userId); 

      // So, if you update _user's fields. What is stored in the session will be changed as well. 
      _user.UserId = userId; 
      _user.UserName = userName; 
      _user.Email = email; 

      // Regardless, if you "saved" back or not 
      if (submit.Equals("Submit with Save")) { 
       // because the left-hand side and the right-hand side are the same object 
       HttpContext.Current.Session[Model.Common.UserSessionNameValue] = _user; 
      } 
      Response.Redirect(Request.RawUrl); 
     } 
    } 
</script> 

這裏是你可以以避免無意中更新它做什麼:

<script runat="server"> 
    private Model.User _user; 

    protected void Page_Load(object sender, EventArgs e) { 
     if (!string.IsNullOrWhiteSpace(Request.Form["Submit"])) { 
      var strUserId = Request.Form["UserId"] ?? string.Empty; 
      var userName = Request.Form["UserName"] ?? string.Empty; 
      var email = Request.Form["Email"] ?? string.Empty; 
      Int32 userId; 
      Int32.TryParse(strUserId, out userId); 

      _user = new Model.User() 
      { 
       UserId = userId; 
       UserName = userName; 
       Email = email; 
      } 

      if (Request.Form["Submit"] == "Submit with Save") { 
       HttpContext.Current.Session[Model.Common.UserSessionNameValue] = _user; 
      } 

      Response.Redirect(Request.RawUrl); 
     } 
    } 
</script> 
+0

非常感謝。我會標記你的答案,但你能解釋爲什麼會話價值得到更新,正如你的第一部分所述。謝謝! – RoLYroLLs

相關問題