关于Asp.Net的生命周期的文章,很多很多,不管是管道生命周期,还是页面生命周期,图文并茂的文章并不少,我就不说了,我只是在复习这些知识点的时候,想具体知道一个页面的Page_Load方法到底是怎么被调用,被执行的,为什么访问一个网址,就可以直接在Page_Load中断点调试了。所以,写了几句代码来模仿一下这个方法被执行的过程。

1.新建一个页面Default.aspx的时候,首先看到的大概是一个这样的类,里边你只能看到这个Page_Load方法

public class Default : Page
{
public void Page_Load(string test)
{
MessageBox.Show(test);
}
}

2.那么,你从浏览器访问这个Default.aspx的时候,这个Page_Load方法是怎样被调用的呢?

我们看一下Page类的实现,Page类继承自IHttpHandler接口,这个接口里边我只写了一个方法ProcessRequest,在这个方法里边调用了OnPageLoad方法,在System.Web.UI.Page这类里边是有很多的事件和方法的,整个页面的生命周期也是在ProcessRequest这个方法中执行的,这里只是简单模拟一下。

public class Page : IHttpHandler
{
public event Action<string> PageLoad; public void OnPageLoad(string test)
{
PageLoad(test);
} public void ProcessRequest(string test)
{
OnPageLoad(test);
}
}
public interface IHttpHandler
{
void ProcessRequest(string test);
}

3.最后一步也是关键性的一步,这个ProcessRequest方法是怎么被执行的,这个事件PageLoad与这个方法OnPageLoad,又是怎么关联上的?

我写了一个AspNetFrameWork的类来模拟Asp.Net WEB框架做的事情,ASP.NET 页框架支持以自动方式将页事件与方法相关联,只需要设置这个值为true

AutoEventWireup="true"

由此可见,框架是做了很多的事情的,只是你看不到!从管道生命周期到页面生命周期,关键点就是IHttpHandler接口!对于aspx这种资源的请求,配置文件中配置的就是Page类来响应。

public class AspNetFrameWork
{
public AspNetFrameWork()
{
Default myPage = new Default();
myPage.PageLoad += myPage.Page_Load;
myPage.ProcessRequest("test");
}
}

4.最后调用。

private void button1_Click(object sender, EventArgs e)
{
AspNetFrameWork work = new AspNetFrameWork();
}

Page_Load是怎样被执行的-LMLPHP

05-19 18:30