C# 如何在任何地方获得课堂上的会话值?

C# 如何在任何地方获得课堂上的会话值?,c#,asp.net,session,C#,Asp.net,Session,我在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.

我在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; }
    }
其次,我创建class 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 

谢谢大家。

正如您在评论中所说的,您需要为您的
会话
创建一个包装器类

下面是您可以轻松实现它的方法。我试图遵循您最多编写的代码:

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。如果您在会话中添加了新属性(例如,“Language”),则需要显著更改违反OCP原则的
MySession
类。

正如您在评论中所说,您的
会话需要一个包装类

下面是您可以轻松实现它的方法。我试图遵循您最多编写的代码:

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。如果在会话中添加新属性(例如“语言”),则需要显著更改违反OCP原则的
MySession
类。

为什么要将
MySession
分配给
HttpContext.Current.session[“Group”]
?您以前在其中设置了值,并且希望访问它。还是你没有?请描述您将在那里存储什么,什么是
obj.GROUP\u MOD\u ID
(它是字符串)?@YeldarKurmangaliyev代码看起来有点合理-围绕会话值访问的包装类-不确定为什么您会发现代码错误。我以97%的概率猜测-OP尝试访问请求之外的
HttpContext.Current
(即在某些单元测试代码中)。@AlexeiLevenkov可能,我就是不明白。这就是为什么我问他一个问题。对于我来说,
value\u group
现在是从常量值“group”分配的,
MySession
正在覆盖以前设置的
obj.group\u MOD\u ID
值。我可能错了,但这不是会话值包装器应该如何编写的:)@YeldarKurmangaliyev我明白了-可能是将OP副本粘贴到随机样本中。。。将3个字段打包到单个对象中并在会话状态中使用一个键来存储它似乎是一种合理的方法,但在阅读post OP时,可能希望通过包装器从会话状态中读取单个值(
Current.value\u region
返回
…session[“region”]
cast到它的类型…不清楚。@YeldarKurmangaliyev完全正确,正如Alexei Levenkov所说。你能给我一些建议吗。你为什么要将
MySession
分配给你的
HttpContext.Current.Session[“Group”]
?您以前在其中设置了值,但您想访问它。或者您不想访问它?请描述您将在那里存储什么,什么是
obj.GROUP\u MOD\u ID
(是字符串)?@YeldarKurmangaliyev代码看起来有些合理-围绕访问会话值的包装类-不确定为什么您会发现该代码错误。我的猜测是97%的概率-OP尝试访问
HttpContext.Current
请求之外(即在某些单元测试代码中)@AlexeiLevenkov也许吧,我就是不明白。这就是我问他一个问题的原因。至于我,
value\u group
现在是从常量值“group”赋值的,
MySession
正在覆盖以前设置的
obj.group\u MOD\u ID
value。我可能错了,但这不是会话值包装器应该写的:)@YeldarKurmangaliyev我明白了-可能是粘贴到随机样本上的OP副本。。。将3个字段打包到单个对象中并在会话状态中使用一个键来存储它似乎是一种合理的方法,但在阅读post OP时,可能希望通过包装器从会话状态中读取单个值(
Current.value\u region
返回
…session[“region”]
cast到它的类型…不清楚。@YeldarKurmangaliyev完全正确,正如Alexei Levenkov所说。你能给我一些建议吗。你为什么要将
MySession
分配给你的
HttpContext.Current.Session[“Group”]
?您以前在其中设置了值,但您想访问它。或者您不想访问它?请描述您将在那里存储什么,什么是
obj.GROUP\u MOD\u ID
(是字符串)?@YeldarKurmangaliyev代码看起来有些合理-围绕访问会话值的包装类-不确定为什么您会发现该代码错误。我的猜测是97%的概率-OP尝试访问
HttpContext.Current
请求之外(即在某些单元测试代码中)@AlexeiLevenkov也许吧,我就是不明白。这就是我问他一个问题的原因。至于我,
value\u group
现在是从常量值“group”赋值的,
MySession
正在覆盖以前设置的
obj.group\u MOD\u ID
value。我可能错了,但这不是会话值包装器应该写的:)@YeldarKurmangaliyev我明白了-可能是粘贴到随机样本上的OP副本。。。将3个字段打包到单个对象中并在会话状态中使用一个键来存储它似乎是一种合理的方法,但在阅读post OP时,可能希望通过包装器从会话状态中读取单个值(
Current.value\u region
返回
…session[“region”]
cast-to-it-type…不清楚。@YeldarKurmangaliyev完全正确,正如Alexei Levenkov所说。你能做到吗