2013-08-26 2 views
3

Я знаю, что есть темы со схожим заголовком, но это совсем другое.Хранение и получение нескольких значений за один сеанс

Во-первых, чтобы сохранить несколько значений за один сеанс, я должен использовать List, тогда как я храню список со значениями в сеансе, правильно?

Если это так, когда я хочу добавить значение в список, который уже находится в сеансе, затем я извлекаю список из сеанса и добавляю значение. Но нужно ли назначать список обратно сессии каждый раз, когда я добавил/удалил значение из List? Или, по умолчанию, он автоматически обновляется в сеансе, когда я манипулирую им, поскольку он был назначен сначала в сеансе и после этого.

UPDATE: предоставление образцов кода моего вопроса

public void assignNewID(int currentID) 
{ 
    if(Session["usersID"] == null) 
    { 
     Session["usersID"] = new List<int>(); 
    } 

    if(currentID != null) 
    { 
     var list = (List<int>)Session["usersID"]; 
     list.Add(currentID); 

     // now should I hereby assign the list back to 
     // the session like: 
     // Session["usersID"] = list; 
     // or it gets automatically updated in the session by default ? 
    } 
} 
+0

сделать его более точным путем размещения фактического 'list' декларации и код надстройки к-сессии. –

+0

@HenkHolterman - Я обновил сообщение с образцом кода. :) – Syspect

ответ

0

Смотрите этот пример

public static class SessionManager 
{ 
    public static List<Entity.Permission> GetUserPermission 
    { 
     get 
     { 
      if (HttpContext.Current.Session["GetUserPermission"] == null) 
      { 
       //if session is null than set it to default value 
       //here i set it 
       List<Entity.Permission> lstPermission = new List<Entity.Permission>(); 
       HttpContext.Current.Session["GetUserPermission"] = lstPermission; 
      } 
      return (List<Entity.Permission>)HttpContext.Current.Session["GetUserPermission"]; 
     } 
     set 
     { 
      HttpContext.Current.Session["GetUserPermission"] = value; 
     } 
    } 
} 

сейчас в любом случае

protected void chkStudentStatus_CheckedChanged(object sender, EventArgs e) 
    { 
     Entity.Permission objPermission=new Entity.Permission(); 
     SessionManager.GetUserPermission.Add(objPermission); 
     SessionManager.GetUserPermission.RemoveAt(0); 


    } 
7

List является ссылочным типом, так что вы хранение reference к вашей сессии, которая будет обновляться, если объект обновляется,

Session gets updated for reference type

2

Попробуйте это:

// Saving in session 
      System.Collections.Hashtable ht = new System.Collections.Hashtable(); 
      ht.Add("EmployeeName", "EmpName Value"); 
      ht.Add("Designation", "Designation Value"); 
      ht.Add("Department", "Department Value"); 
      Session["EmployeeInfo"] = ht; 
      //Retrieve from session 
      if (Session["EmployeeInfo"] != null) 
      { 
       string strEmployeeName = ht.ContainsKey("EmployeeName") ? Convert.ToString(ht["EmployeeName"]) : ""; 
       string strDesignation = ht.ContainsKey("Designation") ? Convert.ToString(ht["Designation"]) : ""; 
       string strDepartment = ht.ContainsKey("Department") ? Convert.ToString(ht["Department"]) : ""; 
      } 
4

Существует поймать здесь.

Ваш код в порядке, нет необходимости назначать список обратно (не то, что было бы большой проблемой).

Но только до тех пор, пока вы запускаете это на 1 сервере (<sessionstate mode="inproc" />).

Если вы масштабируете это до нескольких серверов, вы столкнетесь с проблемой, что List<> не помечен как [Serializable]. Ваше решение не будет работать напрямую.

Короткое исправление было бы использовать:

[Serializable] 
class MyList : List<int> 
{ 
} 
Смежные вопросы