AutoEventWireup

AutoEventWireup
  Google了一番,大家讨论AutoEventWireup问题可不少,Page指令的AutoEventWireup属性被设置为true(或者如果缺少此属性,因为它默认为true),该页框架将自动调用页事件,即Page_Init、Page_Load等14个方法,在这种情况下,不需要任何显式的Handles子句或委托。但这是怎么实现的呢?.net又怎样根据AutoEventWireup属性来动态编译或者预编译页面呢?我在Google上没有找到答案。
 

大家好,又见面了,我是你们的朋友全栈君。

  Google了一番,大家讨论AutoEventWireup 问题可不少,Page 指令的 AutoEventWireup 属性被设置为 true(或者如果缺少此属性,因为它默认为 true),该页框架将自动调用页事件,即 Page_Init 、 Page_Load等14个方法,在这种情况下,不需要任何显式的 Handles 子句或委托。但这是怎么实现的呢?.net又怎样根据AutoEventWireup 属性来动态编译或者预编译页面呢?我在Google上没有找到答案。

 

Scott(K. Scott Allen) 的一篇文章 Inside AutoEventWireup说了当AutoEventWireup为true时,运行时会查找每个方法并注册到相应的事件里,代码就像下面这样:

  

 

Scott说的非常好,但是运行时又是怎么实现的呢?没办法,又是一阵猛翻asp.net源码,终于找到了,代码如下:

 

 BuildAutomaticEventHookup()方法当AutoEventWireup为false时生成了一个重载TemplateControl类的属性SupportAutoEvents,在TemplateControl里该属性返回true,重载代码如下:

 

 

而在TemplateControl类里通过调用 

 

GetDelegateInformation()方法通过多次调用后会调用到GetDelegateInformationFromMethod()方法来实现根据相应方法(Page_Load等)建立委托,代码如下:


  其中参数methodName就是我们通常使用的Page_Load等等方法名了,方法名是一个私有字符串常量,所以就不能在Page页重写了:

 

 

说到这里我想再补充下,上面的方法名常量有16个,但是前面我说了只有14个方法,这又是怎么回事呢?
 

原来Page_Init,Page_Load,Page_DataBind,Page_PreRender,Page_Unload,Page_Error这六个方法无论TemplateControl实例是什么(TemplateControl实例可能是用户控件,或者页面,因为UserControl和Page类都是继承于TemplateControl类的)都会自动注册到相应的事件中去,而Page_PreInit,Page_InitComplete,Page_PreLoad,

Page_LoadComplete,Page_PreRenderComplete,Page_SaveStateComplete只有在TemplateControl实例同样是Page类实例的情况下才会自动注册到相应的事件中去。仔细看剩下的四个方法名,就会发现这是相对应的两组事件处理函数名,默认会添加Page_AbortTransaction和Page_CommitTransaction,如果找不到这两个方法则会查找OnTransactionAbort和OnTransactionCommit方法进行注册,所以说页面会自动注册14个事件处理函数到相应的事件中去(前提是只有这些方法都存在,才会添加成功哦)。

附注:AbortTransaction和CommitTransaction事件用于Enterprise Service Transactions的情况下(@Page指令必须含有Transaction属性,如Transaction=“Required”). 如果需要了解更多信息,可以看看意大利人Alberto Venditti 04年在codeproject上的这篇文章 .NET Distributed Transactions on Enterprise Services: a demo ,或者联系Scott(此Scott仍然是Allen,并非Scott Guthrie),我看过他的博客,他可是这方面的行家。

 

原文:http://www.0431domain.cn/news/news.aspx/5193

 

 

//=================================================

 

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140046.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 初识python廖雪峰_Python3-廖雪峰学习笔记「建议收藏」

    初识python廖雪峰_Python3-廖雪峰学习笔记「建议收藏」Key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到valuedict是用空间来换取时间的一种方法,用在需要高速查找的地方。dict的key必须是不可变对象通过key计算位置的算法称为哈希算法,要保证hash的正确性,作为key的对象就不能变的对象a的内容是’abc’,是指,a本身是一个变量,它指向的对象的内容才是abc’对于不变…

    2025年7月7日
    0
  • TCP/IP协议详解

    TCP/IP协议详解认识HTTP协议它是互联网协议(InternetProtocolSuite),一个网络通信模型,是互联网的一个基本的构架。HTTP协议是HyperTextTransferProtocol(超文本传输协议)的缩写,是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件…

    2022年6月13日
    33
  • appscan激活成功教程版安装_appscan许可证管理在哪

    appscan激活成功教程版安装_appscan许可证管理在哪AppScan 是一个Web漏洞扫描程序,主要适用于Windows系统。该软件内置强大的扫描引擎,可以测试和评估Web服务和应用程序的风险检查,有助于防止破坏性的安全漏洞。1、安装实践环境

    2022年8月1日
    25
  • DOS命令Copy 合并文件

    DOS命令Copy 合并文件我们都知道DOS命令Copy的主要作用是复制文件,可是你是否知道,它还有一个作用是合并文件呢?一般情况下,它主要用于合并相同类型的文件,比如将两个文本文件合并为一个文本文件、将两个独立的MPEG视频文件合并为一个连续的视频文件等。那么,如果用它合并两个不同类型的文件,结果会怎样呢?笔者发现,巧妙地将一个文本文件合并到一个非文本文件中,可以实现隐藏秘密的作用。一起来看看吧。比如你有一段私人信息…

    2022年7月18日
    26
  • golang中的json decode丢失精度的问题

    golang中的json decode丢失精度的问题最近发现的一个坑当用enconding/json包的时候,数字默认是处理为float64类型的,这就导致了int64可能会丢失精度,这时候要用dec.UseNumber将处理的数字转换成json.Number的形式,再自己去做typeassertion代码packagemainimport( "fmt" "encoding/json" "strings")funcCr…

    2022年7月17日
    13
  • tαptαp安装下载_掌上生活app下载安装

    tαptαp安装下载_掌上生活app下载安装环境要求HttpRunner是一个基于Python开发的测试框架,可以运行在macOS、Linux、Windows系统平台上。这里使用macOS系统进行演示对于python版本要求:py

    2022年7月31日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号