您的位置:首页 > 编程语言 > ASP

黑马程序员_学习笔记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指示符的一些信息。



CodeBehind就是当前aspx页面的后台处理文件名,还有一个是Inherts,说明本页面是继承自当前页面的后台处理文件

类_Default的。

那么我们在后台文件中定义一些protect 或者是 public 等属性的字段和成员,都可以通过使用<% = %>和<% C#Code%>

的方式嵌入到aspx页面中。

比如:



在前台页面aspx中:可以使用两种方式向浏览器输出该值



到现在为止,我们知道了aspx其实就是一个继承自aspx.cs文件的一个子类。

但是如果仅仅在是这样的话,下面又会出现一个问题。

比如,我在aspx(子类中)定义了一个公有属性,按.NET的继承规则来说,父类是无法访问到子类中的

对象的。



但是我们发现在CodeBehind文件中,可以调用到该对象。



我们是用this关键字来调用的此对象,按照我们上述分析的这两个文件的关系来说,它理应是调用不到当前这个Label对象

的才对,但是实际上它调用到了。

运用.NET继承中的父类是无法调用到子类资源的这么一个规则,我们可以断定,当前生成的后台文件类实例肯定不是

当前类的实例 (可定不是Default类的实例)。

于是,我就想到了 看看,到底当前后台文件cs生成的类到底是个什么类型,它的基类又是什么?于是就有了下面的代码;



运行该页面之后,得到了如下结果:



现在问题就出来了,每当用户请求一个网页的时候,其实我们都是在后台生成一个处理用户数据的一个HttpHanlder类的实例,

当前的HttpHandler就是CodeBehind文件中的那个Default类,但是为什么 显示的结果却是default_aspx类呢?

更让人费解的是,default_aspx类的基类居然就是_Default类!

这说明了,每一个CodeBehind文件,在被用户请求的过程中生成的实例,并不是它自己本身,而是它的一个子类。

当然,这也并未解释出 为什么能在CodeBehind文件中调用它的子类aspx中的对象这样的一个矛盾。

我们可以通过.NET反编译器查看一个 default文件的子类default_aspx类到底是生成了一个什么样的类,它才能

够调用到aspx中的对象的。

先来看看在反编译程序中,这个类的定义的标头:



我们发现,default_aspx除了我们上述的继承自_Default类之外,还继承了IRequiresSessionState和IHttpHandler。

从子标头中我们就可以知道,它实质上是生成了一和HttpHandler类,也就是说此类就是一个一般处理程序。

一般处理程序HttpHandler类是一个实现了System.Web.IHttpHandler的接口的特殊类。

此类的特殊在于:任何一个实现了IHttpHandler接口的类都可以当做是一个外部用户请求的目标程序(服务器通过反射

来生成当前特殊类的一个实例,执行ProgressRequest方法,响应用户请求)。

当前反编译文件在往下看:

我们会看到:



我们发现,在这个继承自Default类的default_aspx类中,有一个方法是用来创建我们

在aspx文件中定义label控件对象的一个方法。

有了这行代码,也就可以解释了 为什么能在.cs文件中,调用aspx文件中申明的控件 属性对象了。

具体执行过程是这样的:

其实我们在.cs文件中书写的不管是成员字段还是属性方法,其实都已经就是在是当前类的继承类了(这里很特殊),



其实,我们在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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息