[英]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.