不能在使用 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 也给了我错误说:"你不能使用空实例或类似的东西"我该怎么办?

不能在使用 asp.net 中继承的类中使用会话

我创建了一个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的覆盖中。