ASP.NET进阶(4):认识Page类吗?
其实看到这个标题,我想一些人应该知道我们要谈论.cs类的实际应用。以前我是ASP程序员,那时候用VBS脚本编程,如果要使用其他方法(比如公共的方法)就得include一些function.asp,就像js的运行一样也要先引用其他的js函数。 所以,转到ASP.NET后,我也没在意类这个东西,也不清楚静态和非静态的区别,反正就是实例化后就可以调用其方法就行了,而aspx.cs里面都是写方法的,就是一股脑的还是以前的编程模式。或许有些人也有这种经历,但是我们不能一直这样浑浑噩噩的编程,应该清楚方法是如何执行的,我们如何设计类。
随便新建一个ASPX页(我这里只用ASP.NET Web Application,而不是WebSite),都会生成page.aspx\page.aspx.desinger.cs和page.aspx.cs,打开2个.cs文件,会发现其中一个是让我们写方法的,另外一个就是记录我们使用的控件(desginer.cs)。
在VS2003的时候,desginer.cs是不存在的,所有的控件声明都在.cs里,而且默认还会生成一些代码(如下):
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
}
#endregion
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
}
#endregion
我们可以看到 OnInit是初始化事件的方法,默认被重写,因为要执行InitializeComponent这个私有方法,因为InitializeComponent方法每个页面都不一样,之所以不一样是因为他主要是用来给控件的事件订阅方法,比如Button1的Click如果有具体行为,就会在这里增加this.Button1.Click += new EventHandler(Button1_Click);这样按钮在被点击的时候就会执行Button1_Click这个方法了,这些订阅代码VS是自动添加的(虽然你可以手动去改他们),2005以后就被隐匿了(内部已经帮我们实现了)。
由此,我们可以想象到,类的执行顺序,OnInit -> InitializeComponent -> Page_Load -> Your Function。当然还有其他的事件方法,我们接着看。
【注意】这是经常考的面试题:ASP.NET的生命周期!
所谓生命周期,我们都知道一个变量的作用域,一个对象从创建到销毁就是他的生命周期。所以这个考题就是在考你的(PageName)页面类的实例的执行顺序。 执行完了自然就没了。我们新建的页面都是继承自System.Web.UI.Page类,所以基本上就是要看Page类的执行顺序。
详情看官方解释:http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80).aspx,其中介绍了整个过程和相关的事件。
其实Page类也是继承自Control类,所以Page也是个Control哦,所以生命周期里的一些事件,其实是Control的,比如OnInit,OnLoad,OnPreRender,OnUnload,OnDataBinding,所以其他的控件也都支持这些事件。在我们开发自定义控件的时候,也可以操作这些事件,来自定义我们的控件特性。