不能在使用 asp.net 中继承的类中使用会话
本文关键字:会话 继承 net asp 不能 | 更新日期: 2023-09-27 17:56:39
我创建了一个从另一个类继承的网页,如下所示:
class webpage : startup {
.
.
.
}
class startup : System.Web.UI.Page {
}
在我尝试使用的启动类中
Session["blah"] = "some other blah";
但是每当我运行此代码时,我都会收到以下错误:
会话状态只能在以下情况下使用 启用会话状态设置为 true, 在配置文件中或在 页面指令。也请制作 确保 System.Web.SessionStateModule 或 自定义会话状态模块为 包含在 '''' 部分中的部分 配置。
即使将 web.config 更改为接受会话,我也会收到错误,但结果相同------------------------编辑--------------------
我知道我可以使用 Httpcontext.current.session,但这个 approad 也给了我错误说:"你不能使用空实例或类似的东西"我该怎么办?
我创建了一个BasePage
类,如下所示:
namespace JWC.Examples.WebForms.Base {
public class BasePage: Page {
}
}
以及从BasePage
继承的默认页面:
namespace JWC.Examples.WebForms {
public partial class _Default : BasePage {
protected void Page_Load(object sender, EventArgs e) {
if (Session["SomeItem"] == null)
Session["SomeItem"] = 42;
}
}
}
我访问会话完全没有问题。不确定问题是什么,但从 Page 旁边的另一个类继承很可能是红鲱鱼。
如果不包括很多细节,这将很难诊断。我能给出的最好的建议是创建一个空白 ASP.Net 项目,并开始逐个移植,这样您就可以系统地消除可能性。
更新
鲍尔斯先生很友好地给我发了一个测试解决方案,重现了这个问题。
问题在于 ASP.Net 页面生命周期的特性。有问题的代码看起来像这样:
public class BasePage: Page
{
public BasePage()
{
//Do some stuff with Session
}
}
遗憾的是,尝试在构造函数中访问 Session 是非启动器,因为请求和响应对象在调用构造函数之前不会设置。诀窍是将代码移动到已初始化这些内容的阶段,但在其他依赖代码可能需要利用它之前。
PreInit 事件将完成这个伎俩。如果你摆脱了构造函数,并覆盖了 OnPreInit 事件,那么一切都应该没问题。喜欢这个:
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
//Do some stuff with Session
}
了解页面生命周期是在 ASP.Net 中执行任何操作的关键组件。在继续使用 Web 窗体之前,应仔细阅读 MSDN 文档,因为它将节省许多麻烦。
试试这个
class webpage : startup {
…
}
class startup : System.Web.UI.Page {
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
var session = HttpContext.Current.Session["...."];
}
}
所以会话不在Startup
的构造函数中,而是在OnPreInit
的覆盖中。