代码之家  ›  专栏  ›  技术社区  ›  Josh Stodola

回发时未触发ASP.NET BasePage类页面加载

  •  0
  • Josh Stodola  · 技术社区  · 15 年前

    我有下面的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变量表示一个自定义会话类,该类非常简单,只包含几个在整个应用程序中使用的基本设置。问题是,如果发生自然回发(在本例中,它是通过排序/分页进行的gridview回发),则不会触发此基类中的my Page_加载。后来在我的代码中,当我引用SO时,我得到一个空引用异常,因为它尚未从会话中提取。

    为什么基页不加载fire?

    2 回复  |  直到 15 年前
        1
  •  1
  •   s_hewitt    15 年前

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

    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
    
        2
  •  0
  •   David McEwing    15 年前

    可能是Init事件中发生了其他事情导致它失败。因此,与其说它没有被称为,不如说它还没有被称为。

    可能是autoevent wireup没有正确连接,倾向于覆盖OnInit事件并手动附加事件,我也在某个地方读到,这通过不要求框架在每篇文章上进行大量反射来提高性能。

    但回到你的问题上来。。。尝试将SO对象设为私有对象,并为其创建一个属性访问器,该访问器在返回私有变量之前,首先检查是否设置了私有对象(如果未设置)。如果未设置并且找不到它,那么它可以以与加载中相同的方式中止。这意味着要加载变量,您将不依赖于从激发中加载的页面,因此,如果您需要,SO对象应该在init例程期间对您可用。