2016-05-12 9 views
0

私は何かを見つけました。私は期待していなかったし、少し難解です。たぶん私はこれと一緒に感じて、それがすべての仕組みを忘れてしまったので、長い時間が経ちました。ASP.Net C#オブジェクトは一度セッションに保存した後も保持されます

基本的なコンセプトはこれです:

  1. オブジェクトを作成し、Page1の上(バージョン1)それをOBJ1呼び出す
  2. 保存オブジェクトセッションへ
  3. 変更オブジェクトPAGE2にセッションからオブジェクトを取得ページ2のobj1(バージョン2)と呼びますが、セッションに保存しないでください。
  4. セッションからオブジェクトを取得します。
  5. オブジェクトを表示する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

関連する問題