在本地回发后,ASP.NET Session变为null

时间:2012-05-03 15:40:46

标签: c# asp.net

这是我在页面加载时运行的代码:

protected void Page_Load(object sender, EventArgs e)
{
    DisableChaching();
    if (Request.Cookies["UserName"] == null)
    {
        if (Session["UserName"] == null)
        {
            Response.Redirect("~/Default.aspx");
        }
        else if (Session["AccessLevel"].ToString().Equals("2"))
        {
            Response.Redirect("~/Default.aspx");
        }
    }
    else if (Session["AccessLevel"].ToString().Equals("2"))
    {
        Response.Redirect("~/Default.aspx");
    }
    if (!IsPostBack)
    {
        LoadControls();
        BindGrid();
    }
}

有时当我尝试将一些数据保存到数据库并且出现错误时,我尝试通过单击我的保存按钮重新保存数据,我收到此错误:

  

对象引用未设置为对象的实例

如果代码:

,请在以下行中

else if (Session["AccessLevel"].ToString().Equals("2"))

为什么我收到此错误?

这是我在登录用户控件中的代码,其中ChR是记住用户的复选框:

if (ChR.Checked == true)
            {
                Response.Cookies["UserName"].Value = txtUserName.Text.Trim();
                Response.Cookies["UserName"].Expires = DateTime.Now.AddMonths(2);
                Response.Cookies["AccessLevel"].Value = member.AccessLevel.ToString();
                Response.Cookies["AccessLevel"].Expires = DateTime.Now.AddMonths(2);
                Response.Cookies["FirstName"].Value = member.FirstName;
                Response.Cookies["FirstName"].Expires = DateTime.Now.AddMonths(2);
                Response.Cookies["LastName"].Value = member.LastName;
                Response.Cookies["LastName"].Expires = DateTime.Now.AddMonths(2);
                Session["UserName"] = txtUserName.Text.Trim();
                Session["AccessLevel"] = member.AccessLevel.ToString();
                Response.Redirect("~/Default.aspx");
            }
            else
            {
                Session["UserName"] = txtUserName.Text.Trim();
                Session["AccessLevel"] = member.AccessLevel.ToString();
                Session["FirstName"] = member.FirstName;
                Session["LastName"] = member.LastName;
                Response.Redirect("~/Default.aspx");
            }

在我的母版页中,我在page_Load事件中以这种方式为会话分配值:

DisableChaching();
    FillInfo();
    if (Request.Cookies["UserName"] != null)
    {
        Session["UserName"] = Request.Cookies["UserName"].Value;
        Session["AccessLevel"] = Request.Cookies["AccessLevel"].Value;
        Session["FirstName"] = Request.Cookies["FirstName"].Value;
        Session["LastName"] = Request.Cookies["LastName"].Value;
        WellCome();
        if (Session["AccessLevel"].ToString() == "1")
        {
            RenderMenu(AcccessLevel.SiteManager);
        }
        else if (Session["AccessLevel"].ToString() == "2")
        {
            RenderMenu(AcccessLevel.Client);
        }
    }
    else if (Session["UserName"] != null)
    {
        WellCome();
        if (Session["AccessLevel"].ToString() == "1")
        {
            RenderMenu(AcccessLevel.SiteManager);
        }
        else if (Session["AccessLevel"].ToString() == "2")
        {
            RenderMenu(AcccessLevel.Client);
        }

    }
    else
    {
        WellGo();
        RenderMenu(AcccessLevel.LogedOutUser);
    }
enter code here

4 个答案:

答案 0 :(得分:5)

我想我发现为什么我的会话变为空!当我想在db中保存有关书籍的信息并将书籍的图像文件保存在app文件夹中时,我没有权限保存文件,我的应用程序抛出错误,所有会话都变为空!

答案 1 :(得分:1)

替换下面的代码。

string val = Convert.ToString(Session["AccessLevel"]);
if (val == "2")
{

}

我希望您了解==Equals()

之间的区别
public static String AccessLevel {
    get
    {
        return Convert.ToString(HttpContext.Current.Session["AccessLevel"]);
    }
    set
    {
        HttpContext.Current.Session["AccessLevel"] = value;
    }
}

答案 2 :(得分:0)

  

为什么我收到此错误?

因为Session["AccessLevel"]为空并且您正在尝试在Null对象上调用方法。

答案 3 :(得分:0)

对于其他用户,请检查会话超时。可能是问题所在。您可以使用

更改默认超时
<system.web>
   <authentication mode="Forms">
      <forms timeout="50"/>
   </authentication>

   <sessionState timeout="60"  />
</system.web>