2009-09-29 66 views
18

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

也是最好处理重载的OnLoad或Page_Load中的东西?他们有什么不同?

回答

21

ASP.NET有一个名为“AutoEventWireup”的功能 - 此功能允许您创建具有EventHandler签名的方法,其名称为Page_Load,并且运行时会将事件从父页连接到类中的方法。基本上运行时确实这代表您:

this.Load += this.Page_Load; 

现在是最好禁用AutoEventWireup,要么在页面OnInit方法自己创建这些事件处理程序或干脆重写父页面的OnLoad方法。

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

为了像MyButton_Click的方法没有你明确地创建一个事件处理程序,你必须设置OnClick属性在这样的aspx文件的控制工作:

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

这将促使ASP。 NET为您创建按钮单击代理并将其附加到按钮的Click事件。

+0

这个封面控制与ID以及?你能写MyButton_Click吗? –

+0

为什么建议禁用AutoEventWireup? – M4N

+0

@Martin:连接的委托生成发生在执行时,比重写一个方法慢。 @Orion:它不包括按钮点击等,但过程相似。为了像MyButton_Click这样的方法在没有显式创建事件处理程序的情况下工作,您必须在aspx文件中设置控件上的OnClick属性,如下所示:OnClick =“MyButton_Click”。这将提示ASP.NET为您创建按钮单击委托并将其添加到按钮的“Click”事件中。 –

1

查看ASP.NET page lifecycle,其中有描述负载的生命周期事件部分。

负载
的页面调用OnLoad事件 方法在页面上,然后递归 确实为每个子控件, 它做同样的它的每个 子控件的,直到页面和相同所有的 控件都被加载。使用OnLoad事件方法在 控件中设置属性并建立数据库 连接。

而且报价:

注意使用Page_event语法创建事件 处理程序时, 基实现隐式 调用了,因此你不需要 调用它在你的方法。例如,对于 示例,无论您是否使用 创建Page_Load方法,总是会调用基页面类的OnLoad 方法。 但是,如果用覆盖 关键字(在Visual Basic中覆盖), 覆盖页面 OnLoad方法,则必须显式调用基地 方法。例如,如果在页面上重写 OnLoad方法,则 必须调用base.Load(MyBase.Load,在 Visual Basic中)才能运行基本 实现。

+0

有趣的是,如何明确地将事件冒泡,往往被认为是不必要的,容易出错并且乏味。有些人可能会争辩说,重写OnLoad(并调用base.OnLoad)为应用程序增加了编译时安全性和清晰度。 :) – bzlm

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)呼叫,重见光明。

1

Page指令,它说:Autoeventwireup =“真”

那会发生什么,它会自动连入Load事件...(和其他一些事件,如PreInit,初始化,卸载等)

2

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

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

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

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

.NET2仍然这样做,但在单独的文件隐藏在Windows \ Microsoft.Net \ Framework \ v * \ Temporary ASP.Net文件下的某处。

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

相关问题