Переменная сеанса ASP / C # - ссылка на объект не установлена ​​на экземпляр объекта - PullRequest
5 голосов
/ 29 декабря 2011

Я немного новичок в 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 Ответ

7 голосов
/ 29 декабря 2011

Синтаксис, который вы используете в вашем Page_Load методе, который я даже не ожидал бы скомпилировать. Несмотря на это, проблема в том, что вы не установили сеанс с этим ключом, поэтому он вернет null. Когда вы звоните ToString() на этот ноль, вы получаете исключение. Во втором примере:

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

То есть выполняется преобразование нуля в 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. В противном случае вы получите строку из этого хэша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...