ASP.NET Web 页面允许你为你的 Web 站点创建动态内容。而对于静态的 HTML 页面(.htm 或者 .html 文件),服务器则会通过读取该文件并且把它原封不动地发送到浏览器来完成一个 Web 请求。相反,当有人请求一个 ASP.NET Web 页面(.aspx 文件)的时候,该页面就会像 Web 服务器上的程序一样得到运行。一旦页面开始运行,它就可以为你的 Web 站点而完成任何必需的任务,包括数值的计算、读取或者写入数据库信息,或者调用其他程序。而作为它的输出,页面会动态产生标记(HTML 或者其他标记语言中的元素)并且把这个动态输出发送到浏览器。
本文为 ASP.NET Web 页面如何在 Web 应用程序中进行工作的基本特性而提供了一个概览。
回传与往返旅行
ASP.NET 页面作为服务器上的代码而运行。因此,为了让页面被处理,在用户点击按钮的时候(或者在用户选择复选框或者与页面中的其他控件进行交互的时候),页面就被配置成提交到服务器。页面每次都被提交到它自己,因此它可以重新运行它的服务器代码然后呈现自己的一个新版本并且返回给用户。
ASP.NET Web 页面的处理周期是这样的:
- 用户请求页面。(页面通过使用 HTTP GET 方法而被请求。)页面第一次运行并且完成初步的处理,如果你已经对它进行编程并且要求这样做的话。
- 页面动态地把标记呈现给浏览器,因此用户就会发现 Web 页面类似于其他的任何页面。
- 用户输入信息或者作出有效的选择然后点击一个按钮。(如果用户点击链接来替代按钮,那么页面可能只会简单地导航到其他页面,并且第一个页面中不会出现进一步的处理。)
- 页面被发送到 Web 服务器。(浏览器完成一个 HTTP POST 方法,从而在 ASP.NET 中被看成是一个回传。)尤其要注意的是,页面是被回传到它自身的。例如,如果用户正在与 Default.aspx 页面进行操作,那么点击该页面中的一个按钮就可以把指向 Default.aspx 的页面回传到服务器。
- 在 Web 服务器中,页面会重新运行。由用户输入或者选中的信息就可以用在这个页面中。
- 页面完成你的编程处理。
- 页面把它自己呈现回浏览器。
这个周期会在用户与页面进行操作的期间一直得到延续。每次用户点击按钮,页面中的信息都被回传到 Web 服务器并且页面也会重新运行。每个周期都被看作是一个往返旅行。因为页面的处理是出现在 Web 服务器中的,因此页面完成每个动作都需要一次服务器的往返旅行。
提示:ASP.NET Web 页面可以运行客户端脚本,从而不需要到服务器的往返旅行,并且对于用户输入验证和某些类型的 UI 编程来说是非常有用的。关于更多信息,参考:[使用客户端脚本的 ASP.NET Web 页面编程]。
跨页面提交
在有些环境中,你可能需要把页面提交到一个不同的页面,而不是它自己。这就被看作是跨页面提交。例如,你可能创建一系列的页面来处理客户订单。而每个页面都可以提交到页面序列中的下一个页面。关于更多信息,参考:[ASP.NET Web 页面中的跨页面提交]。
页面寿命
不像桌面应用程序窗体一样,ASP.NET Web 页面不会启动,并且运行直到用户与窗体进行操作,然后只在用户点击 Close 按钮的时候才进行卸载。这是因为 Web 天生就是无连接的。当浏览器请求 Web 服务器中的页面时,浏览器与服务器只是在处理请求的时候才是连通的。在 Web 服务器把页面呈现给浏览器之后,连接就被终止。如果浏览器对相同的 Web 服务器产生了另外的请求,即使是相同的页面,那么这个请求也会被当成一个新的请求而被处理。
天生就是无连接的 Web 决定了 ASP.NET 页面运行的方式。当用户请求一个 ASP.NET Web 页面的时候,该页面的一个新实例就会被创建。页面完成它的处理,并且把标记呈现给浏览器,然后就被废弃。如果用户点击一个按钮来完成回传,那么就会创建该页面的一个新的实例,页面再次完成它的处理,并且重新被废弃。因此,每次回传与往返旅行都会导致页面的一个新的实例被创建。
关于更多信息,参考:[ASP.NET Web 页面]。
保留页面状态
在常规 HTTP 协议中,服务器所拥有的页面信息仅仅是由用户使用页面中的控件所指定的信息,因为浏览器只在页面被提交的时候才把这些信息发送给服务器。而其他信息则被废弃(比如变量的值与特性设置)。ASP.NET 会通过下列方式来保持其他页面信息:
- ASP.NET 在往返旅行之间保存控件设置(以及特性),从而被称作保存控件状态。
- ASP.NET 提供状态管理能力,因此你可以在往返旅行中保存你自己的变量与应用程序或者与会话特定的信息。
- ASP.NET 可以检测页面第一次被请求和页面被回传,从而允许你进行有针对性的编程。例如,你可能需要在页面第一次被显示的时候从数据库中读取信息,但不是每次回传都这样做。
提示:服务器可以被配置成缓存页面信息来优化页面,但是出于应用程序编程的目的,这是最清晰的页面考虑,类似于服务器一旦完成对页面的处理之后就会立即进行清理。
关于更多信息,参考:[ASP.NET 状态管理概览]。
ASP.NET Web 页面编程
你可以在 .NET Framework 中使用不同的编程语言来为你的 ASP.NET Web 页面创建服务器代码,包括 Visual Basic,C# 和 J#。ASP.NET Web 页面还可以包含运行在浏览器中的客户端脚本。并且一些 ASP.NET 功能还会生成客户端脚本并且把它们注入到页面中。在这种情况下,ASP.NET 会始终为了最佳的跨浏览器功能而生成 ECMAScript(JavaScript)。另外,你还可以为自定义的功能而添加你自己的客户端脚本。如果这样做,你就可以使用任何与你所针对的浏览器相兼容的客户端脚本语言。
服务器控件
与所有 Web 页面一样,ASP.NET Web 页面也可以包含静态文本。通常,你无论如何都会把控件添加到页面,比如文本框,复选框和按钮。这些控件允许用户与页面进行交互并且在页面被回传之后把信息发送到服务器。
ASP.NET 所提供的一系列的控件被称作 Web 服务器控件。ASP.NET 服务器控件类似于相应的 HTML 窗体元素。例如,ASP.NET TextBox 控件就类似于 HTML 中的 <input type="text"> 标记。但是,ASP.NET 服务器控件提供了比 HTML 元素更加丰富的编程体验。ASP.NET 服务器控件同样提供了比 HTML 元素所能提供的更加广泛的功能。你可以在 ASP.NET Web 页面中使用的服务器控件之一就是日历控件、显示列表或者网格的数据绑定控件,登入控件可以为你的站点添加安全性,等等更多。
关于更多信息,参考:[ASP.NET Web 服务器控件]。
页面与服务器控件的事件
ASP.NET Web 页面与其中的控件支持一个与 Windows Forms 中相似的事件模型。例如,当用户点击 ASP.NET Web 页面中的一个 Button 服务器控件的时候,页面就会被回传到服务器,并且重新被创建,然后点击事件就被触发。因此你可以把代码添加到响应这个点击事件的页面中。
页面本身会在它被初始化的时候引发生命周期事件,比如 Page_Init 与 Page_Load 事件,从而为你提供机会来运行页面启动时的代码。(要记住页面会在每次的往返旅行中被创建并且被重新初始化。)单独的控件可以触发它们自己的事件。比如 Button 控件会引发一个 Click 事件,复选框与单点按钮控件会引发一个 CheckedChanged 事件,而列表框与下拉列表控件则会引发一个 SelectedIndexChanged 事件。有些控件,比如 Calendar 控件,还会引发比简单的点击事件更加抽象的事件。例如,Calendar 控件会在用户导航到一个不同的月份时引发一个 VisibleMonthChanged 事件。
多数 ASP.NET 服务器控件只支持少量能够在服务器代码中被处理的事件。如果要对事件进行处理,那么页面就必须完成一个往返旅行,因此用户的选择就可以被发送到页面来进行处理。但是,服务器控件不会暴露非常频繁发生的事件(比如 onmouseover),因为这样的事件每次被引发时,都会产生额外的服务器往返旅行,因此可能会严重影响页面的响应时间。因此,你可以配置 ASP.NET 服务器控件来引发客户端脚本(比如 onmouseover)。在这种情况下,控件就不需要回传到服务器,并且你还需要创建客户端脚本来对事件进行响应。
更多关于创建并且使用事件和事件处理器的信息,参考:[ASP.NET Web 页面中的服务器事件处理]。
浏览器的兼容
因为 ASP.NET Web 页面的处理出现在 Web 服务器中,因此 ASP.NET Web 页面与任何浏览器与移动设备都是兼容的。Web 页面会自动呈现适应于浏览器的正确标记(XHTML 或者其他标记语言)来显示样式与布局。作为选择,你还可以使用特别被设计用来为特定设备(比如移动电话)呈现输出的控件来创建 Web 页面。关于更多信息,参考:[创建 ASP.NET Mobile Web 页面]。