什么叫Page_Load,它是如何做到的?

时间:2009-09-29 19:45:52

标签: asp.net

Page_Load不是虚方法。什么叫这种方法,它是如何做到的?是反射还是其他技术?还有多少事件以这种方式处理?

同样最好处理重载的OnLoad或Page_Load中的内容吗?他们有什么不同?

5 个答案:

答案 0 :(得分:23)

ASP.NET有一个名为“AutoEventWireup”的功能 - 此功能允许您创建具有EventHandler签名且名称为Page_Load的方法,运行时将从父页面连接事件到你班上的方法。基本上,运行时代表您执行此操作:

this.Load += this.Page_Load;

现在最好禁用AutoEventWireup并在页面OnInit方法中自己创建这些事件处理程序,或者只是覆盖父页面的OnLoad方法。

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

为了使MyButton_Click之类的方法在没有显式创建事件处理程序的情况下工作,您必须在aspx文件中的控件上设置OnClick属性,如下所示:

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

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

答案 1 :(得分:4)

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

你可以使用OnLoad或Page_Load,但你必须知道会发生什么:

  • 在OnLoad中你必须调用base.OnLoad
  • 在base.OnLoad中将引发Load事件
  • 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/>");
}

尝试评论base.OnLoad(e)电话,然后再看一遍。

答案 2 :(得分:2)

Page层次结构上的某个OnLoad方法调用分配给Load的事件(通过+ =)。

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

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

this.Load += new System.EventHandler(this.Page_Load);

.Net2仍然这样做,但是在一个单独的文件中隐藏在Windows \ Microsoft.Net \ Framework \ v * \ Temporary ASP.Net Files下的某个地方。

我在ASP.Net页面生命周期中发现this chart非常有用。

答案 3 :(得分:1)

看一下ASP.NET page lifecycle,有一个描述负载的生命周期事件部分。

  

<强>加载
  Page调用OnLoad事件   页面上的方法,然后递归   为每个儿童控制做同样的事情,   每个都做同样的事情   孩子控制直到页面和所有   控件已加载。使用OnLoad   用于设置属性的事件方法   控制和建立数据库   连接。

进一步引用:

  

请注意,创建活动时   处理程序使用Page_event语法,   基本实现是隐含的   叫,所以你不需要   在你的方法中调用它。对于   例如,基页类的OnLoad   无论你是否总是调用方法   是否创建Page_Load方法。   但是,如果您覆盖页面   使用覆盖的OnLoad方法   keyword(在Visual Basic中覆盖),   你必须明确地调用基数   方法。例如,如果您覆盖   你在页面上的OnLoad方法   必须调用base.Load(MyBase.Load in   Visual Basic)以便为基础   要实施的实施。

答案 4 :(得分:1)

在页面指令中它说:Autoeventwireup =“true”

这会发生什么,它会自动连接到Load事件...(以及其他一些事件,如PreInit,Init,Unload等)。