开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件→设属性→绑事件,便可以行走于天下。但这样真的就可以走一辈子吗?实际上,ASP.Net经常被喷的诟病就在于WebForm以及只会拖控件的ASP.Net程序员,往往大型互联网系统也没有采用WebForm的模式进行开发。但是,WebForm并不是一无是处,而是我们没有用好,还有很多东西我们知其然不知其所以然,现在我们就来对这些平时所不注意但又十分关键的东西一探究竟。
1.1 WebForm时代的请求对象
在WebForm中,所有的页面请求都是以aspx文件作为请求对象(静态化和伪静态的除外)。例如上图中,访问者在浏览器端通过输入URL:blog/index.aspx向服务器端发送请求,服务器端首先找到这个index.aspx,然后创建页面对象(index.aspx.cs文件中的类对象),调用这个页面对象中的ProcessRequest方法和Page_Load方法(在此过程中,有可能需要访问数据库)来生成aspx页面的所有html内容,最后将生成好的html返回给浏览器端。
因此,我们可以知道,服务器端对aspx的处理过程其实就是一个渲染生成html的过程。
1.2 神奇的<%%>
通过实践可知,在aspx中除了<%%>的内容和runat="server"的内容,其他都是原样输出。这是因为我们在aspx中可以借助<%%>写入C#代码,就跟ASP、PHP一样的风格。但是,在实际开发中并不建议这么来做,因为它违反了CodeBehind的原则,不利于职责的分离。
①直接写入C#业务逻辑代码
1 <% 2 for (int i = 0; i < 5; i++) 3 { 4 Response.Write("I am a webform page.<br/>"); 5 } 6 %>
②获取C#方法的返回值
假设页面后端代码中有一个GetServerTime的方法,它只有一句代码:return DateTime.Now.ToString();。页面中只需要通过<%= 方法名() %>即可获取该方法的返回值。
<%= GetServerTime() %>
③aspx中能够访问的方法的访问修饰符只能为public和protected:这是因为aspx和aspx.cs之间的关系是编译生成后aspx和aspx.cs会创建两个类,并且aspx继承自aspx.cs中的类,在面向对象中子类要访问父类的方法,那么方法的访问修饰符必须为public或protected。(后面会讲到aspx和aspx.cs的关系,不要急)
1.3 aspx与ashx的关系
ashx是一般处理程序,它是一个实现了IHttpHandler的轻量级处理程序,处理操作都在ProcessRequest方法中完成。
而aspx则相当于一个特殊的、高级的ashx,aspx所对应的父类是System.Web.UI.Page这个类,通过查看Page类的定义,我们可以看到Page也实现了IHttpHandler的这个接口。另外之所以说它是高级的ashx,是因为aspx帮我们封装了许多底层的操作,使得我们可以进行傻瓜式的开发操作。
看到这里,我们不禁要问:既然有了ashx为何还要aspx?大家都知道ashx中的ProcessRequest方法需要向请求响应报文中输出html,而每个html页内容有很多,如果每次响应都往里边输出html开发起来会很痛苦(这里主要是指在如果不借助模板引擎的情况下),而aspx则起到了类似于于一个模板引擎的作用,帮我们把html的大体框架定义好了,我们在开发中就只需要操作每次响应需要更改的内容即可。
1.4 aspx与aspx.cs的关系
(0)假如我们有以下的名为FirstPage的一个aspx页面:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>第一个WebForm页</title> </head> <body> <form id="form1" runat="server"> <div> 哈哈,我是ASP.Net WebForm,下面看我的表演。 <br /> <% for (int i = 0; i < 5; i++) { Response.Write("I am a webform page.<br/>"); } %> <br /> <%= GetServerTime() %> <br /> <asp:TextBox ID="txtDateTime" runat="server"></asp:TextBox> <asp:Button ID="btnGetTime" runat="server" Text="获取时间" onclick="btnGetTime_Click" /> <br /> <% GetDllInfo(); %> </div> </form> </body> </html>