微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

找出ASP.NET WebForms中控件的生命周期的哪个阶段

从控件的外部,是否可以找出Page LifeCycle(Init,Load,PreRender等)的哪个阶段,特定控件或页面是什么?

例如,在伪代码中:

if myControl.CurrentLifeCycle == Lifecycle.Init
{ do something }

解决方法

我担心没有内置函数可以检查页面页面生命周期阶段.
如果不处理页面本身中的所有事件,也很难添加功能,因为某些事件受到保护.因此,您还可以从Control继承LifeCycleListener类,将其在构造函​​数中添加到侦听页面并覆盖所有事件.

如果你只需要公共“阶段”PreInit,Init,DataBinding,PreRender,Unload,disposed看看下面的方法(VB.Net,但我想你会明白的):

Public Enum LifeCyclePhase
    AfterPreInit
    AfterInit
    AfterLoad
    AfterDataBinding
    AfterPreRender
    AfterUnload
    Afterdisposed
End Enum

Public Interface ITrackingLifeCycle
    ReadOnly Property GetLifeCycleListener() As LifeCycleListener
End Interface

Public Class LifeCycleListener

    Public Sub New(ByVal ctrl As Control)
        Me._Pagelistening = ctrl.Page
        AddListener()
    End Sub

    Private _CurrentPhase As LifeCyclePhase
    Private _Pagelistening As Page

    Public ReadOnly Property CurrentPhase() As LifeCyclePhase
        Get
            Return _CurrentPhase
        End Get
    End Property

    Public ReadOnly Property Pagelistening() As Page
        Get
            Return _Pagelistening
        End Get
    End Property

    Private Sub AddListener()
        AddHandler _Pagelistening.PreInit,AddressOf PreInit
        AddHandler _Pagelistening.Init,AddressOf Init
        AddHandler _Pagelistening.Load,AddressOf Load
        AddHandler _Pagelistening.DataBinding,AddressOf DataBinding
        AddHandler _Pagelistening.PreRender,AddressOf PreRender
        AddHandler _Pagelistening.Unload,AddressOf Unload
        AddHandler _Pagelistening.disposed,AddressOf disposed
    End Sub

    Private Sub PreInit(ByVal sender As Object,ByVal e As EventArgs)
        Me._CurrentPhase = LifeCyclePhase.AfterPreInit
    End Sub

    Private Sub Init(ByVal sender As Object,ByVal e As EventArgs)
        Me._CurrentPhase = LifeCyclePhase.AfterInit
    End Sub

    Private Sub Load(ByVal sender As Object,ByVal e As EventArgs)
        Me._CurrentPhase = LifeCyclePhase.AfterLoad
    End Sub

    Private Sub DataBinding(ByVal sender As Object,ByVal e As EventArgs)
        Me._CurrentPhase = LifeCyclePhase.AfterDataBinding
    End Sub

    Private Sub PreRender(ByVal sender As Object,ByVal e As EventArgs)
        Me._CurrentPhase = LifeCyclePhase.AfterPreRender
    End Sub

    Private Sub Unload(ByVal sender As Object,ByVal e As EventArgs)
        Me._CurrentPhase = LifeCyclePhase.AfterUnload
    End Sub

    Private Sub disposed(ByVal sender As Object,ByVal e As EventArgs)
        Me._CurrentPhase = LifeCyclePhase.Afterdisposed
    End Sub
End Class

此类中的处理程序在页面本身的处理程序之后调用,因此如果你f.e.检查Page中的CurrentPhase.Init你会得到PreInit.因此,我将此阶段称为AfterPreInit.

Partial Public Class _Default
    Inherits System.Web.UI.Page
    Implements ITrackingLifeCycle

    Private lcl As New LifeCycleListener(Me)

    Public ReadOnly Property GetLifeCycleListener() As LifeCycleListener Implements ITrackingLifeCycle.GetLifeCycleListener
        Get
            Return lcl
        End Get
    End Property

您现在可以在任何地方检查生命周期阶段,即使没有通过HttpContext.Current引用控件也是如此:

Public Class FooClass
    Public Shared Sub Foo()
        If Not (HttpContext.Current Is nothing OrElse HttpContext.Current.Handler Is nothing) Then
            If TypeOf HttpContext.Current.CurrentHandler Is ITrackingLifeCycle Then
                Dim page As ITrackingLifeCycle = DirectCast(HttpContext.Current.CurrentHandler,ITrackingLifeCycle)
                Dim phase As LifeCyclePhase = page.GetLifeCycleListener.CurrentPhase
            End If
        End If
    End Sub
End Class

这既没有经过充分的测试,也没有被我自己使用过,而且确实可以改进,但也许它可以帮助你解决当前的问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WPF...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这...
Some samples are below for ASP.Net web form controls:(from http://www.visualize.uk.com/resources/asp
问题描述: 对于未定义为 System.String 的列,唯一有效的值是(引发异常)。 For columns not defined as System.String, the only vali
最近用到了CalendarExtender,结果不知道为什么发生了错位,如图在Google和百度上找了很久,中文的文章里面似乎只提到了如何本地化(就是显示中文的月份)以及怎么解决被下拉框挡住的问题,谈
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence changed a lot since 1.1. Here is the order: App
静态声明: ' Style="position: relative" AppendDataBoundItems="True"> (无 或 空 或
以下内容是从网络上搜集资料,然后整理而来的。不当之处,请不吝指教。(The following were from network, and edited by myself. Thanks in a
Imports System Imports System.Reflection Namespace DotNetNuke '*********************************
Ok so you have all seen them: “8 million tools for web development”, “5 gagillion tools that if you