Page_Load不是一种虚拟方法。什么叫这种方法,它是如何做到的?它是反射还是其他技术?还有多少事件以这种方式处理?什么是Page_Load,它是如何做的?
也是最好处理重载的OnLoad或Page_Load中的东西?他们有什么不同?
Page_Load不是一种虚拟方法。什么叫这种方法,它是如何做到的?它是反射还是其他技术?还有多少事件以这种方式处理?什么是Page_Load,它是如何做的?
也是最好处理重载的OnLoad或Page_Load中的东西?他们有什么不同?
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
事件。
查看ASP.NET page lifecycle,其中有描述负载的生命周期事件部分。
负载
的页面调用OnLoad事件 方法在页面上,然后递归 确实为每个子控件, 它做同样的它的每个 子控件的,直到页面和相同所有的 控件都被加载。使用OnLoad事件方法在 控件中设置属性并建立数据库 连接。
而且报价:
注意使用Page_event语法创建事件 处理程序时, 基实现隐式 调用了,因此你不需要 调用它在你的方法。例如,对于 示例,无论您是否使用 创建Page_Load方法,总是会调用基页面类的OnLoad 方法。 但是,如果用覆盖 关键字(在Visual Basic中覆盖), 覆盖页面 OnLoad方法,则必须显式调用基地 方法。例如,如果在页面上重写 OnLoad方法,则 必须调用base.Load(MyBase.Load,在 Visual Basic中)才能运行基本 实现。
有趣的是,如何明确地将事件冒泡,往往被认为是不必要的,容易出错并且乏味。有些人可能会争辩说,重写OnLoad(并调用base.OnLoad)为应用程序增加了编译时安全性和清晰度。 :) – bzlm
虚拟方法(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)呼叫,重见光明。
Page指令,它说:Autoeventwireup =“真”
那会发生什么,它会自动连入Load事件...(和其他一些事件,如PreInit,初始化,卸载等)
页面层次结构中的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页面生命周期非常有用。
这个封面控制与ID以及?你能写MyButton_Click吗? –
为什么建议禁用AutoEventWireup? – M4N
@Martin:连接的委托生成发生在执行时,比重写一个方法慢。 @Orion:它不包括按钮点击等,但过程相似。为了像MyButton_Click这样的方法在没有显式创建事件处理程序的情况下工作,您必须在aspx文件中设置控件上的OnClick属性,如下所示:OnClick =“MyButton_Click”。这将提示ASP.NET为您创建按钮单击委托并将其添加到按钮的“Click”事件中。 –