ASP.NET 待办事项列表应用程序






4.81/5 (42投票s)
2001年11月16日
7分钟阅读

595436

20484
一个演示 ASP.NET 关键功能的简单应用程序。
概述
我最近参加了一个由 Wintellect 的人举办的为期两天的精彩 ASP.NET 研讨会。回到我的办公桌后,我决定要用 ASP.NET 写一个应用程序,以巩固我学到的东西。这个简单的应用程序就是结果。然而,这个简单的两页式 Web 应用程序演示了如何使用以下所有 ASP.NET 功能:
- Web 控件,包括令人敬畏的
DataGrid
控件(我没开玩笑)。 DataGrid
模板列。- Web 表单数据绑定。
- 动态控件创建。
- 视图状态 (View state)。
- 代码渲染块。
- 数据绑定表达式。
- 代码隐藏 (Code behind)。
除了以上内容,还有展示如何进行简单的 ADO.NET 操作、在 Web 窗体中使用 CSS 的代码,甚至我还为了增加点趣味性而加入了一点 JScript!我使用了 C# 作为代码隐藏编程语言,同样是为了学习体验。
安装与设置
我将从示例代码的安装和设置开始。微软曾吹嘘 ASP.NET 应用程序可以“XCOPY”安装。(如果你不知道 XCOPY 是什么,请打开命令提示符输入 HELP XCOPY。)这几乎是真的。你当然可以将一个 .aspx 文件复制到你的 \inetpub\wwwroot 目录,然后在浏览器中打开它,页面就会执行并显示。事实上,我就是这样开始构建这个应用程序的。很快,我发现我需要使用调试器来弄清楚发生了什么,所以我将项目移到了 **Visual Studio .NET** 中以获得更多的控制,并且我再也没有回头。简而言之,以下是你必须做的才能正确安装项目文件,以便你可以使用 VS.NET 构建和调试代码:
- 将项目源文件解压缩到你的 \inetpub\wwwroot 目录下的 todo 或其他目录中。
- 打开 IIS MMC 管理单元或 Internet 服务管理器。浏览到该目录并选择 **属性**。在 **目录** 选项卡的 **应用程序设置** 部分,点击 **创建**。这会让 IIS 和 VS.NET 满意。
- 编辑文件 ToDo.csproj.webinfo 并将
URLPath
设置为正确的 URL,以访问你存放项目的任何位置 1。 - 在 web.config 文件中,在
<appSettings>
标签内设置 Microsoft Access 数据库的位置(见下文)。 - 你**必须**为本地计算机的 ASPNET 帐户授予对文件 todo.mdb 的修改、执行、读取和写入权限,否则当你尝试更新条目时,会收到“操作必须使用可更新的查询”这个令人困惑的错误消息。欢迎来到安全编程的世界!
完成这些操作后,你应该可以双击 Todo.csproj 在 VS.NET 中打开项目。请注意,我手动创建了一个 Default.htm 文件,它会重定向到 ToDoList.aspx 文件,因为我更喜欢这样做,而不是向 IIS 配置添加默认页面。这样,你就可以访问,例如,https:///todo 来启动应用程序。
源代码概述
我不会在这里尝试进行一个从头到尾的 ASP.NET 教程。我假设如果你对这个示例感兴趣,你愿意自己阅读帮助文件。在这里,我只会重点介绍代码的关键点。
首先,关于数据库。我使用了 **Access 2000** 和 ADO.NET 来为应用程序进行数据访问。这是目前为止最容易上手的方式。我几乎只使用了 OleDbDataAdapter
类和原始 SQL。以下代码片段在使用 ADO.NET 和 ASP.NET 时很常见。
string connStr = ConfigurationSettings.AppSettings["ConnectionString"];
string queryStr = "select * from Items where id=" + idStr;
OleDbDataAdapter adapter = new OleDbDataAdapter(queryStr, connStr);
DataSet ds = new DataSet();
adapter.Fill(ds);
另外,请注意,我将数据库的连接字符串存储在应用程序配置文件中,如安装步骤中所述。在 web.config 文件中,查找以下部分:
<appSettings>
<add key="ConnectionString"
value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
C:\Inetpub\wwwroot\todo\ToDo.mdb" />
</appSettings>
主页面是 ToDoList.aspx。本文档顶部显示了它的快照。我对这个页面的目标是显示待办事项列表,允许进行简单的过滤,并允许添加、修改、删除和关闭条目。在代码中,你可以看到将 ASP.NET Web 控件与传统的 HTML 和 CSS 混合使用是完全可以的。事实上,微软的建议是出于性能原因,在需要动态生成内容之前不要使用 Web 控件。
<asp:TemplateColumn ItemStyle-Width="12">
<ItemTemplate>
<img
src='<%# _priorityUrls[(int)DataBinder.Eval(Container.DataItem,
"Priority") - 1] %>'/>
</ItemTemplate>
</asp:TemplateColumn>
这段代码展示了如何向 DataGrid
添加一个模板列。在这种情况下,我用它来显示待办事项优先级的图标。这里一个关键的点是注意在 src=
标签周围使用单引号(')。虽然未被文档化,但这似乎是使该数据绑定表达式作为属性值起作用的唯一方法。
在页面的 C# 后台代码中,请注意我们如何根据选择的查询动态创建列。例如:
bcOpened = new BoundColumn();
bcOpened.HeaderText = "Opened";
bcOpened.DataField = "Opened";
ToDoDataGrid.Columns.Add(bcOpened);
这段代码动态地向 ToDoDataGrid
添加一个绑定列,在本例中用于显示待办事项首次打开的日期。
在这个文件中另一个值得研究的代码是处理编辑、删除、完成和重新打开命令的方式:
public void ToDoDataGrid_Command(Object sender, DataGridCommandEventArgs e)
数据绑定网格列的工作方式是,当你点击任何编辑/删除/完成/重新打开的锚点时,会运行一小段 JScript 代码。这段 JScript 会导致一个 HTTP POST 请求被发送回 ASP.NET 应用程序。
有一段代码可能会让你抓耳挠腮一段时间,那就是下面这段:
int query = 2;
if (IsPostBack)
{
query = (int)ViewState["query"];
}
else
{
string queryStr = Request.Params["query"];
if (queryStr != null)
query = Int32.Parse(queryStr);
ViewState["query"] = query;
}
在这个页面上,我正在使用 URL 中的一个参数来指示显示三种网格布局中的哪一种。如果参数丢失,我们就默认显示未完成的待办事项。然而,当用户点击任何绑定列的锚点时,HTTP POST 请求会返回给我们,但请求中缺少查询参数,所以我们不知道我们在查看哪个网格。别担心,ASP.NET 视图状态在这里可以拯救一切。视图状态实际上是在生成的 HTML 中实现为一个隐藏字段,它会随着所有其他 HTTP POST 数据一起发送回来。它基本上包含了你表单中所有 Web 控件的序列化 .NET 对象,最棒的是你可以添加自己的内容。在这个例子中,我们实际上是为 Web 窗体本身使用了视图状态,但我们可以用同样的方式将值附加到网格的视图状态上。
ToDoEdit.aspx 中的代码包含一小段 JScript,用于将焦点设置到表单上的控件。你可能会认为这是 ASP.NET 框架的一部分,但似乎并非如此。
<script for="window" event="onload">
window.document.forms["EditItemForm"].children["DescriptionTextBox"].focus();
</script>
另外请注意,OnSubmit
方法可以通过按 Enter 键或点击锚点来调用。当通过 Enter 键提交时,它实际上是通过页面回发 (post back) 进来的。当点击锚点时,它通过 SaveButton_Click
方法返回。
结论
我不得不说,ASP.NET 让构建外观精美、功能强大且有用的 Web 应用程序变得非常容易。真正的障碍在于学习 .NET Framework 类。有成千上万的类可以帮助你更快地编写应用程序。问题是,当你开始时,你可能不知道某个类是否存在,或者如何正确使用它。希望这个示例能通过演示一些关键的 ASP.NET 类的用法,帮助你更快地开始你的 ASP.NET 开发。我认为你最终会同意,ASP.NET 是微软 .NET 计划的**杀手级特性**。