2009-07-22 48 views
0

不會激發我有以下BasePage類...ASP.NET BasePage類的Page_Load上回發

Public Class BasePage 
    Inherits System.Web.UI.Page 

    Private litError As Literal 
    Protected SO As Session 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     SO = Session.Item("SO") 

     If SO Is Nothing Then 
      Session.Abandon() 
      Response.Redirect("~/timeout.htm") 
     End If 

     litError = Page.FindControl("litError") 
     If litError IsNot Nothing Then 
      litError.Visible = False 
     End If 
    End Sub 

    Protected Sub ShowMessage(ByVal Message As String) 
     Show(Message, "message") 
    End Sub 

    Protected Sub ShowError(ByVal Message As String) 
     Show(Message, "error message") 
    End Sub 

    Protected Sub ShowSuccess(ByVal Message As String) 
     Show(Message, "success message") 
    End Sub 

    Private Sub Show(ByVal Message As String, ByVal CssClass As String) 
     If litError IsNot Nothing Then 
      litError.Text = String.Format("<span class=""{0}"">{1}</span>", CssClass, HttpUtility.HtmlEncode(Message)) 
      litError.Visible = True 
     End If 
    End Sub 
End Class 

在這個程序裏的每個頁面繼承這個類。 SO變量表示一個自定義的會話類,這非常簡單,並且只是在整個應用程序中持有一些基本設置。問題是,如果發生自然回發,則此基類中的Page_Load不會觸發(在這種情況下,它是通過排序/分頁進行的GridView回發)。然後在我的代碼中,當我引用SO時,我得到一個空引用異常,因爲它沒有被從會話中拉出。

爲什麼基頁Page_Load沒有啓動?

回答

1

嘗試將您的代碼移動到Page_Init事件中。

Microsoft對生命週期http://msdn.microsoft.com/en-us/library/ms178472.aspx中的每個事件都有一些信息。這個MSDN頁面告訴你在每個事件中你應該處理什麼類型的事情。

你可能要考慮SO實現作爲一個屬性,其中搞定不(不知道這是正確的VB ...)

Dim so As Session = Session.Item("SO") 
    If so Is Nothing Then 
     Session.Abandon() 
     Response.Redirect("~/timeout.htm") 
    End If 
    return so 
0

這可能是別的東西在Init正在發生導致它失敗的事件。所以,而不是它被稱爲它只是還沒有被稱爲。

這可能是因爲自動事件接線沒有正確接線,往往會覆蓋OnInit事件並自己手動附加事件,我也讀過某些地方,這可以提高性能,不需要框架做堆思考每一篇文章。

但回到你的問題...嘗試使SO對象爲私有,併爲其創建一個屬性訪問器,它首先檢查在私有變量返回之前是否設置了私有,如果沒有設置它。如果它沒有設置並且找不到,那麼它可以按照您在加載中所做的相同方式中止。這意味着要加載變量,您將不會依賴於Page_Load的啓動,因此如果您需要它,在初始化例程期間應該可以使用SO對象。