最近做一个小系统,在系统管理后台,做了一个PageBase类,供后台其他页面继承。
在该类的构造函数中验证是否Session有值;有值表示处于登录状态,否则返回后台登录页面。
但一写类似这样的代码: if(Session["key"]!=""){...}, 就提示错误:
只有在配置文件或 Page 指令中将启用会话状态设置为真时,才可以使用会话状态
代码大略这样:
PageBase.cs:
================
public class PageBase : System.Web.UI.Page
{
public PageBase()
{
if(Session["Key"]!="")
{
...
}
}
...
}
Admin_Index.aspx:
================
...
...
Admin_Index.cs
================
public class Admin_Index : PageBase
{
...
private void Page_Load(object sender, System.EventArgs e)
{
...
}
...
}
做了以下测试,查找原因:
1. 在 Admin_Index.cs的Page_Load事件中读写Session,结果:一切正常,可以正常赋值
2. 在 Admin_Index.cs的构造函数中读写Session,结果:提示同样错误
3. 在 PageBase.cs的任意位置读写Session,结果:提示同样错误
似乎只能在Page_Load等系统事件中,才能正常读写。
google了一下,发现可能的几个原因:
1.web.config中 <page enableSessionState="false" />,应为"true"
2.aspx页面中的<mailto:%@%20Page&amp;nbsp;&amp;nbsp;enableSessionState="false">,应为"true"
3.Session["key"]="" 改为 System.Web.Httpcontent.Current.Session["key"]=""
由于Page_Load事件中Session读写正常,基本可以排除上面几个原因;并且可以判断可能是 Session写错了地方。
之后,又搜到一篇:http://www.nqqn.com/ym/183/102910.htm
了解到大概原因:在构造函数运行时,Httpcontent.Current.Session对象未生成,不能引用.
(google下 asp.net事件模型,可以了解下 Session对象是何时产生的);将Session读写放在PaeBase.cs的OnInit事件中,不再有错误。
正确写法:
PageBase.cs:
================
public class PageBase : System.Web.UI.Page
{
public PageBase()
{
}
protected override void OnInit(System.EventArgs e)
{
if(Session["Key"]!="")
{
...
}
}
}