向模板发起请求?

在asp.net 中,cs 和aspx之间的关系,我相信,接触aspx的人,都会脱口而出,aspx是模板,cs 是逻辑代码.这么说,没有错,但是,长久以来,一直有一个奇怪的现象,那就是,难道,我们把请求交给一个模板来处理吗?

具体的来说就是以下的情况,

<form action="test.aspx"></form>,难道,webform中得模板,真的就神通广大到超越了模板的一般定义?

这当然是不可能的,模板,顾名思义,是作为显示层的东西,它的作用,只是用来规定如何显示。再让我们来看一段代码.

<form action="test.php"></form>相信,使用过php的人,都很熟悉,这里的test.php是一个后台处理程序,用上面的话来做类比,应该是类比cs文件的.如果这么想,那我们的.net那段代码,就应该改为

<form action="test.aspx.cs"></form>,呵呵,其实我刚开始碰.net,就这么觉得,不过,失败过后,也没地方去求答案,所以就压下了。

其实action="test.aspx" 是正确的,或者说,就应该这么写。因为aspx并不是一个简单的模板.

首先aspx其实是个类,他其实是一个继承自cs文件中的某个类。关于这一点,我们可以引用杨中科老师的实验来说明,

     Response.Write(this.GetType()+"<br/>");
            Response.Write(this.GetType().Assembly.Location + "<br/>");
            Response.Write(this.GetType().BaseType + "<br/>");
            Response.Write(this.GetType().BaseType.Assembly.Location + "<br/>");

在你的page_Load方法中,输入以上代码,你就会查看到,现在的对象到底是由哪个类实例化的,然后,利用反编译程序,去查看那两个Assembly,你就会发现,当前的类,其实是继承自cs中的类的。

有了这一点,后面的事情,就很好理解了。我们每次所编写的cs文件,其实就是在定义父类。说到这里,我也想说说,我对asp.net的整个运行流程的理解。很粗略,没有整理细枝末节,因为,我觉得,我目前的能力,无法更为深入。

首先,还是那话,asp.net并不神奇,虽然它封装了很多东西,但只要是做web开发,只要是基于http协议,那么,他就必须要遵循http模型:请求-处理-响应。这一点,和PHP,JSP,是完全相同滴。至于为什么ASP.NET看起来如此另类,那就是因为,伟大的微软,实在是太能忽悠人了,他从中搞了很多事情,就是为了屏蔽web开发和windows开发的区别。不论好坏,创意无限。

正题开始,浏览器发出一个request,iis接收到request,在这里,我需要打断下,这个request很有讲究,他不仅仅包含了form中得信息——webform称作postData,还包含了viewstate,同时,还包含了所要引发的事件。从这点看,就可以理解,为什么所有的控件,必须写在那个<form id='form1' runat="server"></form>里了。因为对于asp.net,当你按下一个按钮,选择一个下拉框,其实就是发出一个请求,浏览器会把整个form都给你发送回去。

IIS收到请求,根据请求的aspx,实例化aspx对象,然后,调用aspx对象中的__BuildControlTree(),用来创建控件树,树创建完毕,利用viewstate,恢复控件的相关属性。这里,还需要解释一下,由于.net分postBack和第一次请求。所谓的postBack就是指,浏览器的request中,不包含viewState,说到viewState,其实就是将控件渲染成html时,部分控件的状态,将会被放在viewState这个隐藏字段中。如果是postBack,则恢复控件状态,如果不是,则不恢复控件的状态。

接着,就开始执行事件处理方法,我们能看到的第一个事件方法就是page_Load(),然后,request中,所指明的事件

最后,IIS调用HTML引擎,解析控件树,并将解析结果写回response中,发回客户端。

最后一步,销毁aspx对象。

整个一个处理周期,大致如此,当然,其中还有很多的事件,因为,给我们最直观的两个事件,其实就是,page_Load和在request里指定的事件。

ASP.NET WEBFORM之所以如此另类,是因为,在后台处理过程中,依然采用事件驱动模型。但是,即使如此,仍然没有跳出http模型。

以上,只是我对asp.net 的一些逐步认识,如有错误,还希望园中的各位高手,不吝指出。

最后,谢谢观赏。

转载于:https://www.cnblogs.com/jayroe/archive/2011/08/19/2145199.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值