开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件→设属性→绑事件,便可以行走于天下。但这样真的就可以走一辈子吗?实际上,ASP.Net经常被喷的诟病就在于WebForm以及只会拖控件的ASP.Net程序员,往往大型互联网系统也没有采用WebForm的模式进行开发。但是,WebForm并不是一无是处,而是我们没有用好,还有很多东西我们知其然不知其所以然,现在我们就来对这些平时所不注意但又十分关键的东西一探究竟。

1.1 WebForm时代的请求对象

ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘

  在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方法中完成。

ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘

  而aspx则相当于一个特殊的、高级的ashx,aspx所对应的父类是System.Web.UI.Page这个类,通过查看Page类的定义,我们可以看到Page也实现了IHttpHandler的这个接口。另外之所以说它是高级的ashx,是因为aspx帮我们封装了许多底层的操作,使得我们可以进行傻瓜式的开发操作。

ASP.Net WebForm温故知新学习笔记:一、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>
View Code

相关文章: