了解 ASP.NET WebForms 中控件处于生命周期的哪个阶段

2023-12-26

从控件的外部,是否可以找出特定控件或页面处于页面生命周期的哪个阶段(初始化、加载、预渲染等)?

例如,在伪代码中:

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

恐怕没有内置函数来检查页面处于哪个页面生命周期阶段。 在不处理页面本身中的所有事件的情况下添加此功能也很困难,因为某些事件受到保护。因此,您还可以从 Control 继承 LifeCycleListener 类,将其添加到构造函数中以监听页面并覆盖所有事件。

如果您只需要公共“阶段”PreInit,Init,Load,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

此类中的处理程序是在页面本身的处理程序之后调用的,因此如果您检查Page.Init中的CurrentPhase你会得到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

这既没有经过充分的测试,也没有被我自己使用,当然可以改进,但也许它对您当前的情况有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 ASP.NET WebForms 中控件处于生命周期的哪个阶段 的相关文章

  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • HTML 属性 bgcolor 已弃用:用什么代替?

    VStudio ASP NET 给出以下消息 Attribute bgcolor is considered outdated A newer construct is recommended 推荐的结构是什么 bgcolor是在一个 td
  • 在 gridview 控件中使用单选按钮

    我有一个 gridview 控件 其中使用存储过程显示数据 该网格有三列 第一列包含单选按钮 总体思路是用户应该能够从 在我的例子中 5 个单选按钮中仅选择一个单选按钮 当前功能的问题是我可以同时选择所有单选按钮 我尝试使用 groupna
  • 获取GridView中选定行的索引

    我想使用复选框获取从 gridview 选择的行 复选框是这样的
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 使用 asp.net 发送 20,000 多封电子邮件

    我正在编写一个应用程序 需要向从我们的数据库中选择的学生发送大量电子邮件 每封电子邮件都将进行个性化 包括他们的姓名 学习课程等 因此需要一次发送一个 我可以在 SmtpClient 上循环执行此操作 但我担心我尝试发送的数字最终会遇到超时
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 使用内存中的单元测试 .ToListAsync()

    下面是由于内存数据库集不支持 ToListAsync 而在 ShouldNotThrow 上失败的测试 我没有方便的确切措辞 但你明白了 如果它很重要 我正在尝试模拟实体框架版本提供的数据库集 6 1 3 TestFixture publi
  • ASP.NET:如何隐藏ListBox控件垂直滚动条?

    我已经尝试过CSS 溢出 自动 这不起作用 有什么办法可以实现吗 我是否需要创建我在 ASP NET 论坛上看到的自定义控件 我会像您提到的那样创建一个自定义控件 您想要的目标是什么 创建自己的滚动条以放入列表框中
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 将 MVC 站点部署到 IIS 会导致找不到默认共享部分视图

    我有一个可以在本地 IIS 上完美运行的网站 我的所有页面都使用默认的共享部分视图 这称为预期 Layout cshtml 该视图放置在我的共享文件夹中 这可以在这里看到 正如我所期望的那样 这非常有效 不过 我现在发布了我的网站 然后 我
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • ListItem 附加自定义值

    我在asp net中使用dropdownlist 它有代表下拉列表项目的ListItem集合 每个ListItem只有两个字段来保存数据 Value和Text字段 但这些还不够 我想保存更多数据对于每个项目 假设附加字段中有 Text1 和
  • 通过 ASP.NET 网站管理员工具获得 Asp.Net 会员资格

    我使用 aspnet regsql 创建了一个数据库 该数据库是在 sql server 2008 中创建的 而不是在我的项目中的数据文件夹中创建的 我需要手动将其移动到该文件夹 吗 接下来 在网站管理工具中 我转到提供商部分并单击 测试
  • 使用 ASP.NET 控件而不进行数据绑定

    看来我使用 ASP NET 数据绑定太久了 以至于忘记了一些基础知识 我正在 ASPX 页面中动态创建一个表 无需数据绑定 foreach XXX x in TTTT gt tr td td tr
  • 如果 mVC 中不存在该 url,则重定向到页面未找到页面

    如果 url 不存在 我需要将用户重定向到未找到页面 如果用户复制网址并将其粘贴到浏览器上 页面将显示找不到页面的方法 在这我需要将用户重定向到页面未找到页面 看看这个 如何在 ASP NET MVC 中正确处理 404 https sta
  • ASMX Web 服务 - 返回带有属性的用户定义的类

    嘿 我正在尝试从 Web 方法返回用户定义的类 该类具有属性和 或方法 给出以下网络方法 WebMethod public List
  • ASP.Net CascadingDropDown 和 EnableEventValidation="false"

    我刚刚从 AJAX 工具包中获得了 CascadingDropDown 与 SelectedIndexChanged 一起使用 以重定向到传递所选值的查询字符串的页面 我好高兴啊 但是 我只能通过向页面添加 EnableEventValid
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时

随机推荐

  • Android:解析 HTML 代码块

    我有以下 HTML 代码 我需要对其进行解析以检索玩家姓名和他得分的得分 在本例中为 Ross Taylor 和 9 解析此信息的最佳方法是什么 不想使用 HTML 解析器 REGEX 是最好的方法吗 我知道人们强烈反对这一点 但我只想要这
  • 如何在 C/C++ 中以编程方式查找“Saved Games”文件夹?

    我正在写一个游戏 我计划将保存存储在 保存的游戏 目录中 如何以编程方式查找 已保存游戏 文件夹的位置 它需要在非英语 Windows 上运行 黑客喜欢 USERPROFILE Saved Games不是一个选择 保存的游戏目录可以通过SH
  • 如何有效地随机选择数组项而不重复?

    我知道这个问题有很多形式 但我一直无法找到与我的具体效率问题相关的答案 我有下面的代码 效果很好 我有一个包含 10 个项目的数组 我从中随机选择一个项目 按 Enter 键时 该代码保留了一个由 5 个最近选择组成的数组 这些选择不能随机
  • 在 IE7 中,parent.document.getElementById("...") 为 null 或不是对象

    我做了一些研究 但作为一个 JavaScript 新手 我似乎无法为我的具体情况找到任何有用的东西 我的页面中有一个 iframe 在该 iframe 的文档中 我有以下代码 function fun var slideTitle api
  • 如何使用Jquery获取按钮的id值?

    我有一个带有动态创建的编辑按钮的表格 按钮的 ID 是一个字符串 附加有表内容 ID IE
  • PowerShell 脚本返回意外输出(随机数)

    Problem我正在 PowerShell 中编写一个脚本 将文件上传到 http 服务器 上传成功完成 但执行时在控制台中返回一堆数字 远远超过下面显示的数字 Output 这是我正在运行的脚本 Param Parameter Manda
  • 在 Prolog 中解决文本逻辑难题 - 查找生日和月份

    我正在阅读 7天7种语言 一书 并且已经读到了Prolog章节 作为学习练习 我试图解决一些文本逻辑难题 谜题如下 五姐妹的生日都在不同的月份 并且各自在一周的不同日期 使用下面的线索 确定每个姐妹的生日是在月份和星期几 宝拉出生于三月 但
  • JS:如何检查按钮是否被禁用?

    我想检查按下或未按下的按钮 我怎样才能做到呢 我已经尝试过这样做 但它不起作用 这是我的代码
  • 现在允许重新定义 constexpr 静态数据成员吗? (但不是内联常量)?

    以下代码在 c 14 中的 gcc 和 clang 下均无法编译 但在 c 1z 中编译成功 struct Cls static constexpr int N 0 constexpr int Cls N constexpr int Cls
  • 您将如何在这里使用敏捷? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是敏捷的大力支持者 但我的一个朋友 他还不知道敏捷 他是管理类型 问我如何规划和开发一个复杂的分布式项目 其中包含数据库层 通信层层 接口以及
  • 使用 Go 获取 Python 版本

    我正在尝试使用 Go 获取我的 Python 版本 import log os exec strings func verifyPythonVersion err exec LookPath python if err nil log Fa
  • 将 dll 与 node-ffi 一起使用

    我正在使用 node ffi 访问我购买的自定义硬件提供的 dll 该 dll 使用设备驱动程序来执行操作 他们不提供 dll 文档 但他们有一个 c 中的示例应用程序 该 dll 在 c 中使用像这样 DllImport POS CIDR
  • 我对 REST 有什么不理解的地方?

    我正在构建一个框架 并希望使用它进行构建的开发人员能够允许其部分内容与其他站点共享数据并允许其他站点添加 编辑 删除数据 例如 如果有人制作了一个包含书评 作者 引言 代码示例 评论等的网站 那么开发人员可以制作例如 书评 对于其他网站来说
  • 处理 django 包含模板标签中的请求

    我是 Django 新手 正在尝试将上传文件表单放入包含标签中 所以我可以在各种模板中使用它 我创建了以下包含标签 upload files py register inclusion tag upload form html def up
  • PrimeFaces p:fileUpload 不调用方法

    我正在尝试使用 PrimeFaces
  • MVVM 是否违反了 DRY?

    看来我制作的 ViewModels 看起来可疑地像其他班级一样而且它们似乎需要大量的代码重复 例如在当前的项目中我有 SmartForm Model that represents a data form to fill in has pr
  • 将本地图片上传到tinyMCE

    tinyMCE有一个插入图像按钮 但如何处理其功能 请给出一些代码 我已经对 pavanastechie 编写的代码投了赞成票 但最终我重写了很多次 这是一个更短的版本 可能对某些人有价值 tinymce init toolbar imag
  • 如何在Python中创建链表

    我正在尝试解决 python 中的链表编码挑战 我只给出了以下课程来创建链接列表 Definition for singly linked list class ListNode object def init self x self va
  • 单击小部件时播放声音

    这是我的代码 它打开主要活动 但我似乎找不到一种方法来让小部件播放声音 我尝试过了 向小部件添加一个按钮 不起作用 add an OnClickListener到主要活动 有效 但它打开主要活动 我只想要声音而不是活动 编写一个新方法来播放
  • 了解 ASP.NET WebForms 中控件处于生命周期的哪个阶段

    从控件的外部 是否可以找出特定控件或页面处于页面生命周期的哪个阶段 初始化 加载 预渲染等 例如 在伪代码中 if myControl CurrentLifeCycle Lifecycle Init do something 恐怕没有内置函