Page_Load不是虚方法。什么叫这种方法,它是如何做到的?是反射还是其他技术?还有多少事件以这种方式处理?
同样最好处理重载的OnLoad或Page_Load中的内容吗?他们有什么不同?
答案 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,则不会引发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等)。