2015-06-04 3 views
1

У меня есть несколько сессий в ASP.net, как следует. В файле Test.aspx.cs есть какой-то сеансКак получить значение сеанса в классе в любом месте?

HttpContext.Current.Session["Id"] = obj.USER_MOD_ID; 
HttpContext.Current.Session["Group"] = obj.GROUP_MOD_ID; 
HttpContext.Current.Session["Region"] = obj.REGION_ID; 

И тогда я создать некоторый класс, я хочу, чтобы получить значение сессии.

Во-первых, я создать класс MySession.cs

public class MySession 
    { 
     // private constructor 
     private MySession() 
     { 
      value_group = "Group"; 
      //value_id = "Id"; 
      //value_region = "Region"; 
     } 
     // Gets the current session. 
     public static MySession Current 
     { 
      get 
      { 
       MySession session =(MySession)HttpContext.Current.Session["Group"]; 
       if (session == null) 
       { 
        session = new MySession(); 
        HttpContext.Current.Session["Group"] = session; 
       } 
       return session; 
      } 
     } 
     // **** add your session properties here, e.g like this: 
     public string value_group { get; set; } 
     //public string value_id { get; set; } 
     //public string value_region { get; set; } 
    } 

Во-вторых, я создать класс Test.cs и я хочу получить значение сессии

string value_group = MySession.Current.value_group.ToString(); 
       //string value_id = MySession.Current.value_id.ToString(); 
       //string value_region = MySession.Current.value_region.ToString(); 

Но получить ошибку

Object reference not set to an instance of an object 

Спасибо, ребята.

+1

Почему вы назначаете 'MySession' вашему' HttpContext.Current.Session ["Group"] '? Вы уже установили в нем значения и хотите получить к нему доступ. Или нет? Пожалуйста, опишите, что вы собираетесь хранить там, что такое 'obj.GROUP_MOD_ID' (это строка)? –

+0

Код @YeldarKurmangaliyev выглядит несколько разумным - класс-оболочка вокруг доступа к значениям сеанса - не уверен, почему вы считаете этот код неправильным. Моя догадка с вероятностью 97% - ОП пытается получить доступ к «HttpContext.Current» вне запроса (т. Е. В некотором модульном тестовом коде). –

+0

@AlexeiLevenkov Возможно, я просто не понимаю. Вот почему я задал ему вопрос. Что касается меня, теперь значение value_group присваивается из постоянной величины «Группа», «MySession» перезаписывает ранее установленное значение «obj.GROUP_MOD_ID'». Возможно, я ошибаюсь, но это не так, как должно быть написано обертка значений сеанса :) –

ответ

0

Как вы сказали в комментариях, для класса Session вам нужен класс-оболочка.

Вот как вы можете легко реализовать его. Я попытался выполнить код, который вы писали не больше:

public class MySession 
{ 
    private const string GroupKey = "Group"; 
    private const string RegionKey = "Region"; 
    private const string IDKey = "Id"; 

    private static MySession _session; 
    public static MySession Current 
    { 
     get 
     { 
      return _session ?? (_session = new MySession()); 
     } 
    } 

    public string Group 
    { 
     get 
     { 
      return HttpContext.Current.Session[GroupKey] as string; 
     } 
     set 
     { 
      HttpContext.Current.Session[GroupKey] = value; 
     } 
    } 

    public string Region 
    { 
     get 
     { 
      return HttpContext.Current.Session[RegionKey] as string; 
     } 
     set 
     { 
      HttpContext.Current.Session[RegionKey] = value; 
     } 
    } 

    public string ID 
    { 
     get 
     { 
      return HttpContext.Current.Session[IDKey] as string; 
     } 
     set 
     { 
      HttpContext.Current.Session[IDKey] = value; 
     } 
    } 
} 

Однако, вам, вероятно, это не нужно. Вы работаете только с одним и текущим HttpContext.Current.Session. Значения изменяются динамически, и вы, как я полагаю, хотим получить фактические данные. Таким образом, ваш класс-оболочка может быть статическим классом-оболочкой.

public static class SessionWrapper 
{ 
    private const string GroupKey = "Group"; 
    private const string RegionKey = "Region"; 
    private const string IDKey = "Id"; 

    public static string Group 
    { 
     get 
     { 
      return HttpContext.Current.Session[GroupKey] as string; 
     } 
     set 
     { 
      HttpContext.Current.Session[GroupKey] = value; 
     } 
    } 

    public static string Region 
    { 
     get 
     { 
      return HttpContext.Current.Session[RegionKey] as string; 
     } 
     set 
     { 
      HttpContext.Current.Session[RegionKey] = value; 
     } 
    } 

    public static string ID 
    { 
     get 
     { 
      return HttpContext.Current.Session[IDKey] as string; 
     } 
     set 
     { 
      HttpContext.Current.Session[IDKey] = value; 
     } 
    } 
} 

Кроме того, это не так. Я бы не сделал этого, потому что вы собираетесь описать ключ, getter и setter для каждого свойства сеанса. Если вы добавите новое свойство в сеанс (например, «Язык»), вам нужно будет значительно изменить класс MySession, который нарушает принцип OCP.

+0

Уважаемый @Yeldar, я пробую ваш код, но он не работает. Ошибка и показать ошибку. Ссылка на объект не установлена ​​в экземпляр object 'at' return HttpContext.Current.Session [GroupKey] как строка; ' –

+0

Вероятно, Алексей Левенков. Вы пытаетесь использовать этот класс вне контекста HTTP? Похоже, ваш HttpContext.Current' имеет значение null. –

+0

Yup, прочитайте шаг выше. Здесь я хочу получить сеанс значения в классе orther, но он все равно получает ошибку, сеанс был создан под классом файла Test.aspx.cs. Затем я хочу получить значение сеанса и использовать его в других классах, совершенно новом классе. таких как класс ABC.cs, XYZ.cs, .etc ... –

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