ASP / C#会话变量 - 未将对象引用设置为对象的实例

时间:2011-12-29 15:54:33

标签: c# asp.net session

我对ASP / C#有点新,我遇到了会话变量的问题(可能很简单)。我的项目有一个Site.Master,其中会话变量在Page_Load方法下设置,如下所示:

    protected void Page_Load(object sender, EventArgs e)
    {

        if ((Session)["UserID"]==null || (Session)["UserID"].ToString() == "")
        {
            (Session)["UserID"] = HttpContext.Current.User.Identity.Name.ToString();
            SqlDataReader dr = Sprocs.GetPermissionGroups();

            string groupList = "";

            while (dr.Read())
            {
            if (groupList != "")
                    {
                        groupList = groupList + "|" + dr["WG_Group"].ToString();
                    }
                    else
                    {
                        groupList = dr["WG_Group"].ToString();
                    }
            }
            dr.Close();

            if (groupList != "")
            {
                (Session)["UserGroups"] = groupList;
            }
        }

这确实有效。如果我将会话变量'UserGroups'转储到此方法中的标签或其他内容,它会正确显示变量内容。

所以,当我尝试访问同一会话变量时,我的问题在于另一个页面(比如default.aspx)。在另一页的Page_Load方法中,我尝试这样做:

    protected void Page_Load(object sender, EventArgs e)
    {
            string GroupList = HttpContext.Current.Session["UserGroups"].ToString();
            //some code with the variables here
    }

这始终失败,并且“对象引用未设置为对象的实例”。错误。我试图让Session变量错误吗?我试过了

string GroupList = Session["UserGroups"].ToString(); 

这也是同样错误的错误。

string GroupList = (string)(Session["UserGroups"]); 

这总是返回一个空字符串。

我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:7)

您在Page_Load方法中使用的语法我甚至无法编译。无论如何,问题是您没有使用该密钥设置会话,因此它将返回null。当您在该null上调用ToString()时,您将获得异常。在你的第二个例子中:

string groupList = (string)(Session["UserGroups"])

即将null转换为string,这会导致空字符串(因此不会导致异常)。

您应该可以像这样重写Page_Load实现:

string sessionUserId = Session["UserId"] as string;

if(string.IsNullOrEmpty(sessionUserId))
{
    Session["UserId"] = HttpContext.Current.User.Identity.Name.ToString();

    SqlDataReader dr = Sprocs.GetPermissionGroups();

    string groupList = "";

    while (dr.Read())
    {
        if (groupList != "")
        {
            groupList = groupList + "|" + dr["WG_Group"].ToString();
        }
        else
        {
            groupList = dr["WG_Group"].ToString();
        }
    }
    dr.Close();

    Session["UserGroups"] = groupList;
}

然后,在稍后访问会话变量时,请执行以下操作:

 string userGroup = Session["UserGroups"] as string;

这是尝试将会话中的任何存储桶转换为字符串的安全方法。如果密钥不存在,或者值不是字符串,则会得到null。否则,您将从该哈希中获取字符串。