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");

我已经尝试过了,但是一旦更新列表,会话变量也会更新,并且在回发时,我会在 Session 中获得更新的值。这是预期的行为吗?如何使用它以使会话不更新?我什至尝试在使用后将“字符串”变量设置为空,但会话仍然在每个回发时添加了项目。

也许我可以添加一些具体的代码来解释。

假设我的页面上有一个按钮单击事件:

     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 个值,因为我从 Session 中获取它并且它是一个局部变量。但实际上每次单击它时,都会添加值“jkl”,因此值的数量会不断增加。我不希望这种情况发生。我希望我更清楚。

4

2 回答 2

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;
        }
    }
}
于 2012-06-25T09:04:37.543 回答
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 />";
    }
} 

*更新: *Session 持有对 List 的引用,a 也是如此。两者都引用同一个列表,因此如果您在会话中或会话中进行更改,引用的列表将被更改。请记住,Session 存储的是引用而不是值。现在,为什么“ijk”不断添加?因为列表永远不会超出范围(即使在您的方法完成执行之后),只要 Session 存在,它就会一直存在,所以当您的代码将“ijk”添加到“a”时,它实际上会将值添加到列表中。因此它不断将值“ijk”添加到 Session 引用的列表中。

于 2012-06-25T11:27:14.127 回答