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」が追加されるため、値の数は増え続けます。私はそれが起こることを望んでいません。私はより明確であることを願っています。

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」の 4 つの値が追加されます。a.Add("jkl") は if 句の外にあるため、連続してクリックするたびに "jkl" が追加されます。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 は List への参照を保持します。どちらも同じリストを参照しているため、セッションまたはセッションで変更を加えると、参照されたリストが変更されます。Session は値ではなく参照を保存していることを思い出してください。では、なぜ「ijk」が追加され続けるのでしょうか。リストは(メソッドの実行が終了した後でも)スコープ外に出ることはないため、セッションが終了するまでリストはそこに残ります。そのため、コードが「ijk」を「a」に追加すると、実際に値がリストに追加されます。そのため、セッションが参照しているリストに値「ijk」を追加し続けます。

于 2012-06-25T11:27:14.127 に答える