ASP.NET BasePage类Page_Load未在回发时触发

时间:2009-07-22 19:57:26

标签: asp.net inheritance

我有以下的BasePage类......

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没有开火?

2 个答案:

答案 0 :(得分:1)

尝试将代码移动到Page_Init事件中。

Microsoft对生命周期http://msdn.microsoft.com/en-us/library/ms178472.aspx中的每个事件都有一些信息。这个MSDN页面告诉你每个事件应该处理什么类型的事情。

您可能想要将SO作为属性实现,其中Get有(不确定这是否是正确的VB ...)

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

答案 1 :(得分:0)

可能是Init事件中发生了导致其失败的其他事情。因此,它还没有被调用,而是还没有被调用。

可能是autoevent连接没有正确连接,倾向于覆盖OnInit事件并自己手动附加事件,我还读过某些地方,这可以通过不要求框架做反射堆来改善性能在每个帖子上。

但回到你的问题...尝试将SO对象设为私有并为其创建一个属性访问器,在返回私有变量之前,首先检查是否设置了private,如果没有设置它。如果未设置且无法找到,则可以按照与加载相同的方式中止。这意味着要加载变量,您将不依赖于触发的Page_Load,因此如果您需要,在初始化例程期间SO对象应该可用。