簡體   English   中英

不能在 asp.net 中使用的 class 中使用 Session

[英]can't use Session in a class that is using inherited in asp.net

我創建了一個從另一個 class 繼承的網頁,例如:

class webpage : startup {
.
.
.
}


class startup :  System.Web.UI.Page  {

}

和內部啟動 class 我正在嘗試使用

Session["blah"] = "some other blah";

但是每當我運行此代碼時,我都會收到以下錯誤:

Session state 只能在 enableSessionState 設置為 true 時使用,無論是在配置文件中還是在 Page 指令中。 還請確保 System.Web.SessionStateModule 或自定義 session state 模塊包含在應用程序配置的 \\ 部分中。

即使將 web.config 更改為接受 Session 后,我也會收到錯誤,但結果還是一樣------------編輯----- --------------

我知道我可以使用 Httpcontext.current.session 但這個 approad 也給我錯誤說:“你不能使用 null 實例或類似的東西”我該怎么辦?

我創建了一個BasePage class 如下:

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;
      }
   }
}

我完全沒有訪問 session 的問題。 不確定問題是什么,但是從 Page 旁邊的另一個 class 繼承很可能是一個紅鯡魚。

如果不包含很多細節,這將很難診斷。 我能給出的最好建議是創建一個空白的 ASP.Net 項目,然后開始一一移植,這樣您就可以系統地消除可能性。

更新

Powers 先生非常友好地向我發送了一個重現問題的測試解決方案。

問題在於ASP.Net 頁面生命周期的特性。 有問題的代碼看起來像這樣:

public class BasePage: Page
{
    public BasePage()
    {
        //Do some stuff with Session
    }
}

不幸的是,嘗試在構造函數中訪問 Session 是不可能的,因為直到調用構造函數之后才會設置 Request 和 Response 對象。 訣竅是將您的代碼移動到已經初始化這些東西的階段,但在其他依賴代碼可能需要利用它之前。

PreInit事件可以解決問題。 如果您擺脫構造函數並覆蓋 OnPreInit 事件,那么一切都應該沒問題。 像這樣:

protected override void OnPreInit(EventArgs e)
{
    base.OnPreInit(e);

    //Do some stuff with Session
}

了解頁面生命周期是在 ASP.Net 中執行任何操作的關鍵組件。 在繼續使用 Web Forms 之前,應該徹底閱讀 MSDN 文檔,因為這樣可以省去很多麻煩。

嘗試這個

class 網頁:啟動{

. . . }

class 啟動:System.Web.UI.Page {

受保護的覆蓋無效 OnPreInit(EventArgs e) {

base.OnPreInit(e); var session = HttpContext.Current.Session["...."];

} }

所以 session 的東西不在stratup的構造函數中,而是覆蓋OnPreInit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM