2011-05-09 65 views
1

下面是當一個母版頁合併內容頁中發生的事件序列:在主Page_Load事件和內容頁

http://msdn.microsoft.com/en-us/library/dct97kc3.aspx

所以,我的問題是:

我有一個登錄頁面(不使用母版頁),一個母版頁和數百個內容頁面。

我爲您在母版頁登錄會話Session["loggedInUser"](如果不登錄,重定向到登錄頁面)

所以,當我不登錄,如果我輸入一個內容頁面的地址,它必須檢查在主頁面登錄會話並重定向到登錄頁面,對不對?但這裏有兩種情況:

如果在內容頁,我不使用相關Session["loggedInUser"]任何東西,它會重定向到登錄頁面,因此,它是確定在這裏!

第二種情況:如果我使用Session["loggedInUser"]在內容頁中顯示用戶名,例如:

UserInfo loggedInUser = (UserInfo)Session["loggedInUser"]; 

,將在此返回null對象,因爲在內容頁中page_load在母版頁page_load之前解僱,所以它會使用空對象而不是重定向到登錄頁面。

我也試過在母版頁Page_PreInit但沒有幫助

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    if (Session["loggedInUser"] == null) 
    { 
     Response.Redirect("~/Login.aspx"); 
    } 
} 

什麼建議嗎?

+0

您是否也可以在上面的Page_PreInit方法期間拋出的異常發佈堆棧跟蹤? – Jaymz 2011-05-09 10:09:09

+0

我不會發布它,因爲這是無稽之談。它只是像'System.NullReferenceException:對象引用沒有設置爲對象的實例那樣'的一些東西。並指向內容頁面中的代碼,我得到'loggedInUser'對象 – 2011-05-09 10:19:07

+0

這是一個非常奇怪的問題。會話[「loggedInUser」]是否只在重定向或服務器重定向之前被設置在登錄頁面中。傳輸回主頁面下的內容頁面? (根本不在主頁面邏輯中)PS - 我通常在Master.Page_Init()中檢查身份驗證... – 2013-07-25 20:55:34

回答

1

最後我想出了一個解決方案:

我創建一個類BasePage這樣的:而不是從Page繼承

public class BasePage : System.Web.UI.Page 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     if (Session["loggedInUser"] == null) 
     { 
      Response.Redirect("~/Login.aspx"); 
     } 
     base.OnLoad(e); 
    } 
} 

並在內容頁面,我更改爲BasePage並且它完美地工作

感謝您的支持

尼斯天;)

1

你可以在內容頁面的Page_PreRender()而非Page_Load()或替代,做在Page_Init(),而不是Page_Load()母版頁檢查檢查Session["loggedInUser"]。我們遇到了同樣的問題,並選擇了主頁面Page_Init(),這樣我們仍然可以在所有內容頁面中使用Page_Load()

編輯:這是Page_Init()不是PreInit()

+0

我已經試過了,但不知何故它也不能工作:( – 2011-05-09 08:35:01

+0

@Hatake它看起來像我們使用'Page_Init ()'而不是'Page-PreInit()',我編輯了我的答案。 – 2011-05-09 10:07:36

+0

@Jackson謝謝,我會試試:) – 2011-05-09 10:20:34

1

大概,當你說你正在使用Session["loggedInUser"]的值時,你接着調用.ToString()方法或類似的方法來顯示它?

在這種情況下,您需要在使用它之前檢查空對象。這將是在任何情況下使用的任何方法之前檢查對象是否存在等最佳實踐,所以:

if (Session["loggedInUser"] != null) 
{ ... } 

只有您確信代碼將永遠沒有被執行正在實例化會話對象可以使用方法而不檢查空引用。

http://msdn.microsoft.com/en-us/library/03sekbw5.aspx

+0

是的,我先檢查null,然後將會話對象轉換爲用戶對象 – 2011-05-09 08:34:20

+0

您首先檢查null,然後僅在** object!= null,正確的情況下將會話對象轉換爲用戶對象**。 – Jaymz 2011-05-09 08:53:50

+0

是的,我這樣做,但這不是重點,因爲內容頁面中的'page_load'事件在母版頁中的'page_load'事件之前觸發,我不想檢查內容頁面,因爲我有數百頁... – 2011-05-09 09:19:25

0

我有2個masterpages(1預登錄,第二次針對afterlogin),主頁是獨立的,註銷頁面繼承postlogin頁)中的所有postloginpage會議CHCK如果sessionnull(XYZ)其他(重定向loginpage)所有這一切都在afterlogin.master的Page_Init事件中................ Successfull

+0

有格式化答案的神奇教程。請參閱這些。這將有助於你格式化你的答案,這是可以理解的。檢查[this](http://stackoverflow.com/questions/how-to-answer)和[this](http://stackoverflow.com/editing-help) – 2013-11-20 13:57:39