黑马程序员_学习笔记23_ASP.NET中aspx 和 aspx.cs之间的关系

---------------------- 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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值