2012-06-25 1 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"); 

Я пробовал это, но как только я обновить список, переменная сеанса обновляется также и на постбэка я получаю обновленное значение в сессии. Это ожидаемое поведение? Как это сделать, чтобы сеанс не обновлялся? Я даже пытался установить переменную «string» в 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 />"; 
    } 
} 

Каждый раз, когда я нажимаю кнопку, я должен ожидать «а» содержит только 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», «ГХИ» и «JKL». И на каждом последующем клике добавляется «jkl», потому что a.Add («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 содержит ссылку на список и так делает. Оба ссылаются на один и тот же список, поэтому, если вы вносите изменения в или в сеанс, список ссылок будет изменен. Помните, сессия хранит ссылку, а не значение. Теперь, почему «ijk» продолжает добавлять? Поскольку список никогда не выходит за рамки (даже после того, как ваш метод завершает выполнение), он остается там до тех пор, пока выполняется Session, поэтому, когда ваш код добавляет «ijk» к «a», он фактически добавляет значение в список. Поэтому он продолжает добавлять значение «ijk» в список, на который ссылается Сессия.

+0

Нет, это побеждает цель. Я мог бы легко инициализировать код в Page_Load и добавить код элемента при нажатии кнопки. он должен работать в обоих случаях. Сессия не должна обновляться при обновлении переменной. –

+0

. Пожалуйста, ознакомьтесь с обновленным ответом. Я почти уверен, это очистит ваши сомнения и решит вашу проблему. –

+0

Ответьте на свой вопрос, если я вам помог. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^