2012-06-25 90 views
1

我在這裏看到很多關於在會話中存儲列表然後檢索它們的帖子。大部分的答案遵循這種技術:當鏈接變量更新時會話得到更新

if(Session["Strings"]==null) 
{ 
     //Create List 
     List<string> strings = new List<string>(); 
     ... 
     Session["Strings"] = strings; 
} 
else 
     strings = Session["Strings"] as List<string> 

//Add item to list 
strings.Add("asdf"); 

我都試過,但我只要一更新列表,會話變量也被更新和回傳我獲取會話中更新後的值。這是預期的行爲?如何使用它以便會話不被更新?我甚至嘗試在使用後將'strings'變量設置爲null,但會話在每個回發中仍然有添加的項目。

也許我可以添加一些具體的代碼來解釋。

可以說我有一個按鈕單擊事件我的網頁上:

 protected void GoClicked(object sender, EventArgs e) 
{ 

    List<string> a; 
    if(Session["data"] == null) 
    { 
     a = new List<string>(); 
     a.Add("abc"); 
     a.Add("def"); 
     a.Add("ghi"); 

     Session["data"] = a; 
    } 
    else 
    { 
     a = (Session["data"] as List<string>); 
    } 
    a.Add("jkl"); 
    foreach (string s in a) 
    { 
     lblTest.Text += s + "<br />"; 
    } 
} 

每次我按一下按鈕,我應該期待,因爲我從會話獲取它「a」到只包含4個值和它是一個局部變量。但實際上每次點擊它時,都會添加'jkl'值,因此值的數量不斷增加。我不希望發生這種情況。我希望我更清楚。

+0

這是使用In-Proc Session還是Out-Proc?我想知道這是否會發生在Out-Proc? –

回答

0

我認爲ViewState是您要搜索的。儘量保持它們在ViewState上,以保持頁面中的這些變量。這是您可以使用該代碼:

const string _cListWStringsName = "cListWStrings_cnst"; 

public List<string> cListWStrings 
{ 
    set 
    { 
     ViewState[_cListWStringsName] = value; 
    } 
    get 
    { 
     if (ViewState[_cListWStringsName] is List<string>) 
     { 
      return (List<string>)ViewState[_cListWStringsName]; 
     } 
     else 
     { 
      var NewOne = new List<string>(); 

      ViewState[_cListWStringsName] = NewOne; 

      return NewOne; 
     } 
    } 
} 
+0

您的代碼與我發佈的代碼類似,除非您使用ViewState並定義屬性。我也嘗試過使用ViewState - 在變量'strings'更新後也會更新。我認爲這與'字符串'是ref類型有關。當我使用一個簡單的整數時它工作正常。 –

+0

@RupeshSaini也許我不完全瞭解你的問題... – Aristos

+0

我已編輯我的問題,以包括更多的代碼 –

0

第一次單擊該按鈕,四個值增加「ABC」,「DEF」,「GHI」和「JKL」。並且每次連續點擊「jkl」都會被添加,因爲a.Add(「jkl」)位於if子句之外。你需要把它移動if語句裏面,那就是:

protected void GoClicked(object sender, EventArgs e) 
{ 

    List<string> a; 
    if(Session["data"] == null) 
    { 
     a = new List<string>(); 
     a.Add("abc"); 
     a.Add("def"); 
     a.Add("ghi"); 
     a.Add("jkl");//Move here 
     Session["data"] = a; 
    } 
    else 
    { 
     a = (Session["data"] as List<string>); 
    } 

    foreach (string s in a) 
    { 
     lblTest.Text += s + "<br />"; 
    } 
} 

* UPDATE: *會話保存到列表的引用等做了。兩者都引用相同的列表,所以如果您在會話中或會話中進行更改,引用的列表將會更改。記住,Session是存儲引用而不是值。現在,爲什麼「ijk」不斷添加?因爲列表永遠不會超出範圍(即使在您的方法完成執行後),只要會話保持不變,所以當您的代碼將「ijk」添加到「a」時,它實際上將該值添加到列表中。所以它不斷地將值「ijk」添加到Session引用的列表中。

+0

不,這是失敗的目的。我可以很容易地在Page_Load中創建初始化代碼,並在按鈕單擊時添加項目代碼。它應該在兩種情況下都有效。當變量更新時,會話不應該更新 –

+0

請查看更新後的答案。我非常確定,它會清除你的疑惑並解決你的問題。 –

+0

如果我幫你,請回答你的問題。謝謝。 –