Asp.net 什么叫页面加载?它是如何实现的?
页面加载不是虚拟方法。什么调用此方法以及它是如何实现的?是反射还是其他技术?还有多少事件是这样处理的 另外,在重载的OnLoad或Page_加载中处理事情更可取吗?它们有何不同?请看,有一节介绍了负载的生命周期事件 加载Asp.net 什么叫页面加载?它是如何实现的?,asp.net,Asp.net,页面加载不是虚拟方法。什么调用此方法以及它是如何实现的?是反射还是其他技术?还有多少事件是这样处理的 另外,在重载的OnLoad或Page_加载中处理事情更可取吗?它们有何不同?请看,有一节介绍了负载的生命周期事件 加载 该页调用OnLoad事件 方法,然后递归地 对每个子控件执行相同的操作, 它对每个对象都有相同的作用 子控件,直到页面和所有 控件已加载。使用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事件的结果调用
更新:您可以使用带有以下代码的空页面来查看发生了什么:
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,或者自己在pagesOnInit
方法中创建这些事件处理程序,或者简单地覆盖父页面的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)会增加应用程序的编译时安全性和清晰度