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,所以其他的控件也都支持这些事件。在我们开发自定义控件的时候,也可以操作这些事件,来自定义我们的控件特性。
分类:
ASP.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?