黑马程序员_学习笔记23_ASP.NET中aspx 和 aspx.cs之间的关系
2012-04-13 20:54
597 查看
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
一般我们可以认为 ASP.NET中 aspx 和aspx.cs 是平行关系的两个文件。
aspx是显示前台HTML代码界面。而aspx.cs是后台处理数据逻辑的文件。
它们两结合在一起就交CodeBehind技术。(实质也是HttpHandler处理模型)。
这里提一下 WebSite 和 WebApplication的区别。WebSite是网站而WebApplication是网络应用程序。
它们两 大致上是相同的。唯一不同的地方是,WebSite的任何修改可以不用重启服务器。
而WebApplication的任何一次修改(后台代码的修改),则必须重启一次服务器才能到达预期效果。
原因是WebApplication的每一次启动 都会生成一个DLL文件(一次生成多次运行),而WebSIte则是
多次运行,多次生成。
在aspx文件的标头,我们可以看到Page指示符的一些信息。
![](http://my.csdn.net/uploads/201204/13/1334317962_3184.jpg)
CodeBehind就是当前aspx页面的后台处理文件名,还有一个是Inherts,说明本页面是继承自当前页面的后台处理文件
类_Default的。
那么我们在后台文件中定义一些protect 或者是 public 等属性的字段和成员,都可以通过使用<% = %>和<% C#Code%>
的方式嵌入到aspx页面中。
比如:
![](http://my.csdn.net/uploads/201204/13/1334318152_1351.jpg)
在前台页面aspx中:可以使用两种方式向浏览器输出该值
![](http://my.csdn.net/uploads/201204/13/1334318262_5457.jpg)
到现在为止,我们知道了aspx其实就是一个继承自aspx.cs文件的一个子类。
但是如果仅仅在是这样的话,下面又会出现一个问题。
比如,我在aspx(子类中)定义了一个公有属性,按.NET的继承规则来说,父类是无法访问到子类中的
对象的。
![](http://my.csdn.net/uploads/201204/13/1334318413_7534.jpg)
但是我们发现在CodeBehind文件中,可以调用到该对象。
![](http://my.csdn.net/uploads/201204/13/1334318498_6011.jpg)
我们是用this关键字来调用的此对象,按照我们上述分析的这两个文件的关系来说,它理应是调用不到当前这个Label对象
的才对,但是实际上它调用到了。
运用.NET继承中的父类是无法调用到子类资源的这么一个规则,我们可以断定,当前生成的后台文件类实例肯定不是
当前类的实例 (可定不是Default类的实例)。
于是,我就想到了 看看,到底当前后台文件cs生成的类到底是个什么类型,它的基类又是什么?于是就有了下面的代码;
![](http://my.csdn.net/uploads/201204/13/1334318718_9949.jpg)
运行该页面之后,得到了如下结果:
![](http://my.csdn.net/uploads/201204/13/1334318778_6005.jpg)
现在问题就出来了,每当用户请求一个网页的时候,其实我们都是在后台生成一个处理用户数据的一个HttpHanlder类的实例,
当前的HttpHandler就是CodeBehind文件中的那个Default类,但是为什么 显示的结果却是default_aspx类呢?
更让人费解的是,default_aspx类的基类居然就是_Default类!
这说明了,每一个CodeBehind文件,在被用户请求的过程中生成的实例,并不是它自己本身,而是它的一个子类。
当然,这也并未解释出 为什么能在CodeBehind文件中调用它的子类aspx中的对象这样的一个矛盾。
我们可以通过.NET反编译器查看一个 default文件的子类default_aspx类到底是生成了一个什么样的类,它才能
够调用到aspx中的对象的。
先来看看在反编译程序中,这个类的定义的标头:
![](http://my.csdn.net/uploads/201204/13/1334319171_7444.jpg)
我们发现,default_aspx除了我们上述的继承自_Default类之外,还继承了IRequiresSessionState和IHttpHandler。
从子标头中我们就可以知道,它实质上是生成了一和HttpHandler类,也就是说此类就是一个一般处理程序。
一般处理程序HttpHandler类是一个实现了System.Web.IHttpHandler的接口的特殊类。
此类的特殊在于:任何一个实现了IHttpHandler接口的类都可以当做是一个外部用户请求的目标程序(服务器通过反射
来生成当前特殊类的一个实例,执行ProgressRequest方法,响应用户请求)。
当前反编译文件在往下看:
我们会看到:
![](http://my.csdn.net/uploads/201204/13/1334319507_8796.jpg)
我们发现,在这个继承自Default类的default_aspx类中,有一个方法是用来创建我们
在aspx文件中定义label控件对象的一个方法。
有了这行代码,也就可以解释了 为什么能在.cs文件中,调用aspx文件中申明的控件 属性对象了。
具体执行过程是这样的:
其实我们在.cs文件中书写的不管是成员字段还是属性方法,其实都已经就是在是当前类的继承类了(这里很特殊),
![](http://my.csdn.net/uploads/201204/13/1334321292_8937.jpg)
其实,我们在Default中定义的成员字段和函数,不属于Default这个类,而是当前类的子类。
这是一个在编译的过程中就会执行的过程,如果在不是这样的话,那么我们在访问当前aspx文件的label控件时,
那编译器一定会报未定的错误,而此时没报。
所以,最后总结就是,当用户请求某一个aspx页面的时候,ASP.NET框架其实是使用了当前请求页面的.cs文件,当前的
cs文件提供了最基本的HttpHandler的一些属性和实现(IhttpHandler,IRequiresSessionState),然后编译器会通过该cs文件
动态的创建一个继承自该cs文件的一个子类,此子类中包含本身背部的一些定义(比如控件事件方法等)和当前的aspx页面
里面的所有信息。它之所以是一个部分类,部分的是自己当当前的aspx文件。最后,通过这个继承自cs文件的类,外加上aspx
文件中的一些信息来综合起来的另一个类形成了一个完整的HttpHandler文件,然后就可以按照原有HttpHandler的模式来
响应用户的请求了。
最总结论就是:Codebehind文件中的类提供默认的,基本的HttpHandler实现,当前类的继承类结合aspx文件中的信息生成一个新的类,此类就是包含该网页的信息的文件了。
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/
一般我们可以认为 ASP.NET中 aspx 和aspx.cs 是平行关系的两个文件。
aspx是显示前台HTML代码界面。而aspx.cs是后台处理数据逻辑的文件。
它们两结合在一起就交CodeBehind技术。(实质也是HttpHandler处理模型)。
这里提一下 WebSite 和 WebApplication的区别。WebSite是网站而WebApplication是网络应用程序。
它们两 大致上是相同的。唯一不同的地方是,WebSite的任何修改可以不用重启服务器。
而WebApplication的任何一次修改(后台代码的修改),则必须重启一次服务器才能到达预期效果。
原因是WebApplication的每一次启动 都会生成一个DLL文件(一次生成多次运行),而WebSIte则是
多次运行,多次生成。
在aspx文件的标头,我们可以看到Page指示符的一些信息。
![](http://my.csdn.net/uploads/201204/13/1334317962_3184.jpg)
CodeBehind就是当前aspx页面的后台处理文件名,还有一个是Inherts,说明本页面是继承自当前页面的后台处理文件
类_Default的。
那么我们在后台文件中定义一些protect 或者是 public 等属性的字段和成员,都可以通过使用<% = %>和<% C#Code%>
的方式嵌入到aspx页面中。
比如:
![](http://my.csdn.net/uploads/201204/13/1334318152_1351.jpg)
在前台页面aspx中:可以使用两种方式向浏览器输出该值
![](http://my.csdn.net/uploads/201204/13/1334318262_5457.jpg)
到现在为止,我们知道了aspx其实就是一个继承自aspx.cs文件的一个子类。
但是如果仅仅在是这样的话,下面又会出现一个问题。
比如,我在aspx(子类中)定义了一个公有属性,按.NET的继承规则来说,父类是无法访问到子类中的
对象的。
![](http://my.csdn.net/uploads/201204/13/1334318413_7534.jpg)
但是我们发现在CodeBehind文件中,可以调用到该对象。
![](http://my.csdn.net/uploads/201204/13/1334318498_6011.jpg)
我们是用this关键字来调用的此对象,按照我们上述分析的这两个文件的关系来说,它理应是调用不到当前这个Label对象
的才对,但是实际上它调用到了。
运用.NET继承中的父类是无法调用到子类资源的这么一个规则,我们可以断定,当前生成的后台文件类实例肯定不是
当前类的实例 (可定不是Default类的实例)。
于是,我就想到了 看看,到底当前后台文件cs生成的类到底是个什么类型,它的基类又是什么?于是就有了下面的代码;
![](http://my.csdn.net/uploads/201204/13/1334318718_9949.jpg)
运行该页面之后,得到了如下结果:
![](http://my.csdn.net/uploads/201204/13/1334318778_6005.jpg)
现在问题就出来了,每当用户请求一个网页的时候,其实我们都是在后台生成一个处理用户数据的一个HttpHanlder类的实例,
当前的HttpHandler就是CodeBehind文件中的那个Default类,但是为什么 显示的结果却是default_aspx类呢?
更让人费解的是,default_aspx类的基类居然就是_Default类!
这说明了,每一个CodeBehind文件,在被用户请求的过程中生成的实例,并不是它自己本身,而是它的一个子类。
当然,这也并未解释出 为什么能在CodeBehind文件中调用它的子类aspx中的对象这样的一个矛盾。
我们可以通过.NET反编译器查看一个 default文件的子类default_aspx类到底是生成了一个什么样的类,它才能
够调用到aspx中的对象的。
先来看看在反编译程序中,这个类的定义的标头:
![](http://my.csdn.net/uploads/201204/13/1334319171_7444.jpg)
我们发现,default_aspx除了我们上述的继承自_Default类之外,还继承了IRequiresSessionState和IHttpHandler。
从子标头中我们就可以知道,它实质上是生成了一和HttpHandler类,也就是说此类就是一个一般处理程序。
一般处理程序HttpHandler类是一个实现了System.Web.IHttpHandler的接口的特殊类。
此类的特殊在于:任何一个实现了IHttpHandler接口的类都可以当做是一个外部用户请求的目标程序(服务器通过反射
来生成当前特殊类的一个实例,执行ProgressRequest方法,响应用户请求)。
当前反编译文件在往下看:
我们会看到:
![](http://my.csdn.net/uploads/201204/13/1334319507_8796.jpg)
我们发现,在这个继承自Default类的default_aspx类中,有一个方法是用来创建我们
在aspx文件中定义label控件对象的一个方法。
有了这行代码,也就可以解释了 为什么能在.cs文件中,调用aspx文件中申明的控件 属性对象了。
具体执行过程是这样的:
其实我们在.cs文件中书写的不管是成员字段还是属性方法,其实都已经就是在是当前类的继承类了(这里很特殊),
![](http://my.csdn.net/uploads/201204/13/1334321292_8937.jpg)
其实,我们在Default中定义的成员字段和函数,不属于Default这个类,而是当前类的子类。
这是一个在编译的过程中就会执行的过程,如果在不是这样的话,那么我们在访问当前aspx文件的label控件时,
那编译器一定会报未定的错误,而此时没报。
所以,最后总结就是,当用户请求某一个aspx页面的时候,ASP.NET框架其实是使用了当前请求页面的.cs文件,当前的
cs文件提供了最基本的HttpHandler的一些属性和实现(IhttpHandler,IRequiresSessionState),然后编译器会通过该cs文件
动态的创建一个继承自该cs文件的一个子类,此子类中包含本身背部的一些定义(比如控件事件方法等)和当前的aspx页面
里面的所有信息。它之所以是一个部分类,部分的是自己当当前的aspx文件。最后,通过这个继承自cs文件的类,外加上aspx
文件中的一些信息来综合起来的另一个类形成了一个完整的HttpHandler文件,然后就可以按照原有HttpHandler的模式来
响应用户的请求了。
最总结论就是:Codebehind文件中的类提供默认的,基本的HttpHandler实现,当前类的继承类结合aspx文件中的信息生成一个新的类,此类就是包含该网页的信息的文件了。
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/
相关文章推荐
- 黑马程序员之ASP.NET学习笔记:.NET,ASP.NET,C#,VisualStudio之间的关系是什么?
- ASP.NET中xxx.aspx文件,xxx.aspx.cs文件以及xxx.aspx.desinger.cs文件之间的相互关系
- asp.net 中 .ASPX 与.CS文件的关系
- 黑马程序员之ASP.NET学习笔记:TREEVIEW中动态增加结点
- asp.net 中 .ASPX 与.CS文件的关系
- 【转载】ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘
- 黑马程序员之 ASP.NET学习笔记:Server.Excute和Server.Transfer重点讲解
- Asp.net MVC 学习笔记 (3) --Controller 与View 之间的数据传递
- 黑马程序员--ASP.NET基础学习笔记
- ASP.NET学习笔记[7] - aspx页面打开一个新窗体无刷新传值
- 黑马程序员之ASP.NET学习笔记:ASP.NET页面传递值的方式
- 黑马程序员之ASP.NET学习笔记:GET与POST的区别
- 黑马程序员之 ASP.NET学习笔记:JS验证大全
- 黑马程序员之 ASP.NET学习笔记:浅析ASP.NET 3.5与ASP.NET 4.0主要差别
- asp.net 中 .ASPX 与.CS文件的关系
- 黑马程序员之asp.net学习笔记:一般处理程序(*.ashx)小结
- 黑马程序员之ASP.NET学习笔记: 几个常用方法有效优化ASP.NET的性能
- 黑马程序员之 ASP.NET学习笔记:ASP.NET Session的七点认识
- 黑马程序员之ASP.NET学习笔记:Http状态代码及其含义
- ASP.NET学习笔记--自己写的Login.aspx