Asp.net 什么叫页面加载?它是如何实现的?

Asp.net 什么叫页面加载?它是如何实现的?,asp.net,Asp.net,页面加载不是虚拟方法。什么调用此方法以及它是如何实现的?是反射还是其他技术?还有多少事件是这样处理的 另外,在重载的OnLoad或Page_加载中处理事情更可取吗?它们有何不同?请看,有一节介绍了负载的生命周期事件 加载 该页调用OnLoad事件 方法,然后递归地 对每个子控件执行相同的操作, 它对每个对象都有相同的作用 子控件,直到页面和所有 控件已加载。使用OnLoad 用于在中设置属性的事件方法 控制和建立数据库 联系 进一步引述: 请注意,在创建事件时 使用Page_事件语法的处理程序,

页面加载不是虚拟方法。什么调用此方法以及它是如何实现的?是反射还是其他技术?还有多少事件是这样处理的

另外,在重载的OnLoad或Page_加载中处理事情更可取吗?它们有何不同?

请看,有一节介绍了负载的生命周期事件

加载
该页调用OnLoad事件 方法,然后递归地 对每个子控件执行相同的操作, 它对每个对象都有相同的作用 子控件,直到页面和所有 控件已加载。使用OnLoad 用于在中设置属性的事件方法 控制和建立数据库 联系

进一步引述:

请注意,在创建事件时 使用Page_事件语法的处理程序, 基本实现是隐式的 所以你不需要 在方法中调用它。对于 例如,基页类的OnLoad 方法始终被调用,无论 是否创建页面加载方法。 但是,如果覆盖该页面 带重写的OnLoad方法 关键字(Visual Basic中的覆盖), 必须显式调用基函数 方法。例如,如果您覆盖 页面上的OnLoad方法 必须调用base.Load(MyBase.Load in VisualBasic),以便为基础 要运行的实现


调用虚拟方法(OnLoad)和事件处理程序(Page_Load)的顺序由所谓的。这正是ASP.NET运行时处理传入请求的方式(例如,使用Init、Load、Render阶段)

您可以使用OnLoad或Page_Load,但您必须了解发生了什么:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    base.Load += new EventHandler(My_Page_Load);
}

void My_Page_Load(object sender, EventArgs e)
{
    Response.Write("My_Page_Load<br/>");
}

protected override void OnLoad(EventArgs e)
{
    Response.Write("Start of OnLoad<br/>");
    base.OnLoad(e);
    Response.Write("End of OnLoad<br/>");
}

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write("Page_Load<br/>");
}
  • 在OnLoad内部,必须调用base.OnLoad
  • 在base.OnLoad内部,将引发加载事件
  • Page_Load是Load事件(自动连接)的处理程序,因此将作为引发的Load事件的结果调用
如果在OnLoad覆盖中未调用base.OnLoad,则不会引发Load事件


更新:您可以使用带有以下代码的空页面来查看发生了什么:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    base.Load += new EventHandler(My_Page_Load);
}

void My_Page_Load(object sender, EventArgs e)
{
    Response.Write("My_Page_Load<br/>");
}

protected override void OnLoad(EventArgs e)
{
    Response.Write("Start of OnLoad<br/>");
    base.OnLoad(e);
    Response.Write("End of OnLoad<br/>");
}

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write("Page_Load<br/>");
}
protected override void OnInit(事件参数e)
{
碱基.奥尼特(e);
base.Load+=新事件处理程序(我的页面加载);
}
作废我的页面加载(对象发送者,事件参数e)
{
回答。写(“我的页面加载
”; } 受保护的覆盖无效加载(事件参数e) { 响应。写入(“开始加载
”); 基础荷载(e); 响应。写入(“加载结束
”; } 受保护的无效页面加载(对象发送方、事件参数e) { 响应。写入(“页面加载
”; }

请尝试对base.OnLoad(e)调用进行注释,然后再次查看。

ASP.NET有一个名为“AutoEventWireup”的功能—此功能允许您创建具有
EventHandler
签名的方法,其名称为
Page\u Load
,运行时将事件从父页面连接到类中的方法。基本上,运行时是代表您这样做的:

this.Load += this.Page_Load;
现在最好禁用AutoEventWireup,或者自己在pages
OnInit
方法中创建这些事件处理程序,或者简单地覆盖父页面的
OnLoad
方法

编辑(回应OP下面的评论):此过程不包括按钮点击等,但过程类似

要使类似于
MyButton\u Click
的方法在不显式创建事件处理程序的情况下工作,您必须在aspx文件中的控件上设置
OnClick
属性,如下所示:

<asp:button 
    id="MyButton"
    onClick="MyButton_Click"
    runat="server" />


这将提示ASP.NET为您创建按钮单击委托,并将其附加到按钮的
单击事件

页面指令中显示:Autoeventwireup=“true”


这就是所发生的,它自动连接到加载事件。。。(以及其他一些事件,如PreInit、Init、Unload等)

页面层次结构中的OnLoad方法调用分配给Load的事件(通过+=)

命名页面加载只是一种约定。在AutoEventWireUp模式下(即没有显式声明事件处理程序),此约定用于按事件处理程序的名称查找事件处理程序

如果有.Net1可用,您可以看到设计器如何将代码添加到页面的OnInit()中,以添加页面的所有组件并设置

this.Load += new System.EventHandler(this.Page_Load);
.Net2仍在执行此操作,但它位于一个单独的文件中,该文件隐藏在Windows\Microsoft.Net\Framework\v*\ASP.Net临时文件下的某个位置


我发现ASP.Net页面上的生命周期非常有用。

这是否也包括ID控件?你能写MyButton\u Click吗?为什么建议禁用AutoEventWireup?@Martin:wireup的委托生成发生在执行时,比只重写一个方法要慢@猎户座:它不包括按钮点击等,但过程是类似的。要使类似于
MyButton\u Click
的方法在不显式创建事件处理程序的情况下工作,您必须在aspx文件中的控件上设置
OnClick
属性,如下所示:
OnClick=“MyButton\u Click”
。这将提示ASP.NET为您创建按钮单击委托,并将其添加到按钮的
单击事件中;基类使用反射将Thing_事件方法添加为引发的事件的事件处理程序。对吧?有趣的是,显式地冒泡事件总是被认为是不必要的、容易出错的和乏味的。有些人可能会认为重写OnLoad(并调用base.OnLoad)会增加应用程序的编译时安全性和清晰度