2012-05-03 2 views
4

Я попытался найти это, но я даже не уверен, как его фразы для поиска.Использование сеанса для получения/установки свойств объекта каждый раз

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

Вот что я пытаюсь сделать (то, что я до сих пор.):

public class example 
{ 
    public int prop1 {get;set;} 

    public static example Instance 
    { 
     return (example)(HttpContext.Current.Session["exampleClass"] ?? new example()); 
    } 

} 

public class main 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     example.Instance.prop1 = "aaa"; //stores value into session 
     txtInput.Text = example.Instance.prop1; //retrieves value from session 
    } 
} 

Я надеюсь, что имеет смысл на то, что я пытаюсь сделать.

Любая помощь будет оценена, спасибо.

+0

, что ваш вопрос? что вы не работаете для вас? –

+0

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

+0

вам нужно установить переменную сеанса в ваш новый экземпляр в первый раз, отправив решение для вас –

ответ

4

Похоже, вы довольно близки, но у вас нет ничего, чтобы фактически сохранить объект в сеансе. Попробуйте что-то вроде этого:

public static Example Instance 
{ 
    get 
    { 
     //store the object in session if not already stored 
     if (Session["example"] == null) 
      Session["example"] = new Example(); 

     //return the object from session 
     return (Example)Session["example"]; 
    } 
} 

Это в основном только веб-дружеский реализация Singleton Pattern.

+0

не является расточительным для создания нового экземпляра 'Example' каждый раз, даже если вы уже имеете его в сеансе? –

+0

Спасибо за ответ! Один вопрос, однако, разве мы не должны хранить его в сеансе каждый раз, а не только в том случае, когда сессия равна нулю? Я просто думаю, что если я дважды обновляю сессию, то с вашим решением она не будет сохранена для сеанса во второй раз, не так ли? – JMD

+0

@ KrisIvanov: Это немного расточительно, но не ужасно расточительно. Однако это все равно было продемонстрировано. В конце дня это будет зависеть от того, насколько большой объект. –

5

Это было бы легко сделать с дженериками.

Дайте это попробовать.

public class Session 
{ 
    public User User 
    { 
     get { return Get<User>("User"); } 
     set {Set<User>("User", value);} 
    } 

    /// <summary> Gets. </summary> 
    /// <typeparam name="T"> Generic type parameter. </typeparam> 
    /// <param name="key"> The key. </param> 
    /// <returns> . </returns> 
    private T Get<T>(string key) 
    { 
     object o = HttpContext.Current.Session[key]; 
     if(o is T) 
     { 
      return (T) o; 
     } 

     return default(T); 
    } 

    /// <summary> Sets. </summary> 
    /// <typeparam name="T"> Generic type parameter. </typeparam> 
    /// <param name="key"> The key. </param> 
    /// <param name="item"> The item. </param> 
    private void Set<T>(string key, T item) 
    { 
     HttpContext.Current.Session[key] = item; 
    } 
} 
2
public class example { 
    public int prop1 { get; set; } 

    public static example Instance { 
     var exampleObject = (example)(HttpContext.Current.Session["exampleClass"] 
            ?? new example()); 

     HttpContext.Current.Session["exampleClass"] = exampleObject; 

     return exampleObject; 
    } 

} 

вы можете оптимизировать его дальше, при необходимости

4
using System.Web; 
using System.Web.SessionState; 
using System.Collections.Generic; 

public static class ExampleSession 
{ 
    private static HttpSessionState session { get { return HttpContext.Current.Session; } } 

    public static string UserName 
    { 
     get { return session["username"] as string; } 
     set { session["username"] = value; } 
    } 

    public static List<string> ProductsSelected 
    { 
     get 
     {    
      if (session["products_selected"] == null) 
       session["products_selected"] = new List<string>(); 

      return (List<string>)session["products_selected"];   
     } 
    } 
} 

и вы можете использовать его так:

public class main 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //stores value into session 
     ExampleSession.UserName = "foo"; 
     ExampleSession.ProductsSelected.Add("bar"); 
     txtInput.Text = ExampleSession.UserName; //retrieves value from session 
    } 
} 
+0

Сохранено в день ... – SearchForKnowledge

0

Если вы ищете более объектно ориентированного подхода сделать сеанс здесь - хороший способ сделать это ниже.

UserSession Класс

[Serializable()] 
public class UserSession 
{ 

    private CurrentRecord _CurrentRecord; 
    public CurrentRecord CurrentRecord 
    { 
     get 
     { 
      if ((_CurrentRecord == null)) 
      { 
       _CurrentRecord = new CurrentRecord(); 
      } 
      return _CurrentRecord; 
     } 
     set 
     { 
      if ((_CurrentRecord == null)) 
      { 
       _CurrentRecord = new CurrentRecord(); 
      } 
      _CurrentRecord = value; 
     } 
    } 
} 

Глобалы Класс

public static class Globals 
{ 
    public static UserSession TheUserSession 
    { 
     get 
     { 
      if ((HttpContext.Current.Session["UserSession"] == null)) 
      { 
       HttpContext.Current.Session.Add("UserSession", new CurrentUserSession()); 
       return (CurrentUserSession)HttpContext.Current.Session["UserSession"]; 
      } 
      else 
      { 
       return (CurrentUserSession)HttpContext.Current.Session["UserSession"]; 
      } 
     } 
     set { HttpContext.Current.Session["UserSession"] = value; } 
    } 
} 

CurrentRecord класс

[Serializable()] 
public class CurrentRecord 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
} 

Использование в коде позади

public void SetRecordId(int newId) 
    { 
     Globals.TheUserSession.CurrentRecord.id = newId; 
    } 
Смежные вопросы