图 3. 使用表格控制布局的 Web 应用程序
事件驱动
ASP.NET 提供了一种与构建 窗体应用程序极为相似的编程模式。对于简单方案而言,应用程序的“Web”性质可以抛开不谈,您完全可以利用自己的桌面开发经验来快速入门。
演练:挂接事件处理程序
1.双击设计图面上的 Button 控件为其 Click 事件生成代码。
2.输入以下代码。
Label1.Text = "欢迎使用 " & TextBox1.Text
3.按 F5“运行”该 Web 应用程序。
4.在“User Name”文本框输入您的名字。
5.单击“Button”按钮。您会看见类似图 4 的内容。
图 4. 测试事件处理程序
这似乎很符合逻辑,但重要的是要了解这里究竟发生了什么情况。代码在 Web 上运行以生成 HTML 页,HTML 页被发送到浏览器并进行显示。如果这是一个 应用程序,那么包含控件的“窗体”仍会继续运行,而且它可以包含变量等内容。但是,对于 Web 应用程序,当您看见浏览器中的用户界面时,上的 page 类已被卸载。
管理状态
假定要构建一个在每两次用户交互之间必须关闭再重启的桌面应用程序。换句话说,应用程序先创建一个用户可以看见的窗体,而后终止。当用户单击窗体上的某个按钮时,应用程序会默默地重启、处理输入、生成新的“窗体”位图,然后关闭。这样的应用程序非常“健忘”。关闭时不保存和启动时不加载的所有数据都会丢失。窗体级变量实际没什么用处了,因为这些变量的值将会在关闭和启动之间丢失。听起来很奇怪,但实际上这就是 Web 应用程序的工作方式。下列演练将说明这一行为方式。
1.在 Visual Studio 2005 的“解决方案资源管理器”中,右键单击“Default.aspx”,然后单击“查看代码”。
2.在 Inherits System.Web.UI.Page 后面的一行中输入下列代码。
Public previousUser As String
这是一个页面级别的变量,用于先前输入的用户名。3.按如下所示修改 Button1_Click 事件处理程序的代码。
Label1.Text = "您以前叫 " & previousUser & ",现在叫 " & TextBox1.Text
previousUser = TextBox1.Text
如果运行该应用程序,请输入名称 Fred,单击按钮,然后输入名称 Jim 并再次单击按钮,此时应当看到消息:您以前叫 Fred,现在叫 Jim.在桌面应用程序中,此代码会如此工作。但您会发现结果并不是您想像的那样。
4.按 F5 运行该应用程序。
5.输入 Fred 并单击按钮。
6.输入 Jim 并单击按钮。
注意,previousUser 的值始终都不会显示出来。它总是说:您以前叫 ,现在叫 Jim.究竟出了什么问题?
问题在于,每次单击按钮时,page 类都会被破坏然后重新创建。也就是说这一过程是:将 previousUser 创建并初始化为一个空字符串,然后为其分配文本框中的值,页面处理完成,破坏 page 类,丢弃 previousUser 变量。当再次单击按钮时,再重复这一过程。
页面不能用来站点需要在几次用户交互之间记住的任何信息。而 ASP.NET 通过“Session”变量来提供这种存储功能。
7.按如下所示修改 Button1_Click 事件处理程序的代码。
Label1.Text = "您以前叫 " & Session("previousUser") & ",现在叫 " & TextBox1.Text
Session("previousUser") = TextBox1.Text
8.按 F5 运行该应用程序。
9.输入 Fred 并单击按钮。
10.输入 Jim 并单击按钮。
现在,一切就如您所愿了(请参见图 5)。通过使用 Session 变量,站点可以跨越用户交互记住有用信息。
图 5. 使用 Session 变量管理状态
管理状态是 Web 开发和桌面开发之间最大的区别。如果您需要 Web 站点来跨越用户交互记住任何信息(通常要这样做),就不