2015-04-24 1 views
1

Вопрос фон:Сохранять значение переменной сеанса после его очистки?

У меня есть объект сеанса, который используется для хранения списка объектов под названием «CartItems». Я конвертирую этот объект в фактический экземпляр, устанавливаю его в другую переменную List, а затем окончательно очищаю список. Затем он отправляется в переменную ViewBag и отправляется в представление.

Вопрос:

То, что я пытаюсь сделать, не может быть возможно, но в данный момент, как только я очищаю экземпляр списка из CartItems все ссылки на это будут потеряны, а также. Пожалуйста, смотрите следующий код:

public ActionResult Complete(string OrderId) 
    { 
     //Retrieve the CartItem List from the Session object. 
     List<CartItem> cartItems = (List<CartItem>)Session["Cart"]; 

     //Set the list value to another instance. 
     List<CartItems>copyOfCartItems= cartItems; 

     //Set the ViewBag properties. 
     ViewBag.OrderId = OrderId; 
     ViewBag.CartItems = copyOfCartItems; 

     //Clear the List of CartItems. This is where the **issue** is occurring. 
     //Once this is cleared all objects that have properties set from 
     //this list are removed. This means the ViewBag.CartItems property 
     //is null. 
     cartItems.Clear(); 

     return View(ViewBag); 
    } 

Могу ли я сохранить это значение, не теряя его после очистки списка?

+1

Вы хотите [скопировать список] (http://stackoverflow.com/questions/1952185/how-do -i-Тетрадь элементы-из-списка-к-список-без-Еогеаспа). – Jasen

+0

@ Jasen огромное спасибо, что отлично работали. Если вы установите это как ответ, я отметю его правильно – user1352057

+0

Chintana предоставил хороший ответ и причину. – Jasen

ответ

1

Когда вы

ListcopyOfCartItems = cartItems;

Вы создаете другую переменную по имени copyOfCartItems, которая указывает на те же объекты CartItems объекта. Другими словами, cartItems и copyOfCartItems теперь представляют собой два имени для одного и того же объекта.

Итак, когда вы делаете cartItems.clear(); вы очищаете все элементы списка на базовом объекте.

Чтобы обойти эту проблему, сделайте копию cartItems, вместо создания ссылки

List<CartItems> copyOfCartItems = new List<CartItems>(); 

cartItems.ForEach(copyOfCartItems.Add); //copy from cartItems 
0

Если вы хотите, чтобы очистить Session["Cart"], используйте Session.Remove("Cart")

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. –

+0

Нет, Николай, этот _can_ будет ответом на вопрос. Я предполагаю, что автор не работает правильно с сессией – nZeus