1、第10章 设计实例,本章学习目标 利用ASP.NET开发基于 Web的数据库应用系统的常用技术与技巧,第10章 设计实例,10.1 留言簿10.2 文件上传10.3 在线投票系统10.4 在线问卷调查系统10.5 在线考试系统10.6 在线购物系统,10.1 留言簿,10.1.1 留言簿简介10.1.2 留言显示模块10.1.3 “留言”模块,10.1.1 留言簿简介,网站中的留言簿提供两种主要功能,一是分页显示留言内容,二是允许用户写入留言内容。为了提高运行效率、增强留言信息的可管理性,本例将留言以及相关信息存储在数据库中。本节实现的留言簿由两个ASP.NET网页和一个Access数据库组成
2、。其中数据库用于保存留言及相关信息,网页则分别用于显示留言和写入留言。留言显示界面如图所示,该界面与文件Prac10-01-1.aspx对应。该界面主要实现分页显示留言记录的需求。此外,为了便于用户使用,还另外提供了允许用户选择每页显示记录数的功能。在留言显示界面中,设置了一个指向“留言”界面的超链接。,10.1.1 留言簿简介,“留言”界面如图所示,该界面与文件Prac10-01-2.aspx对应。该界面主要供访客撰写并提交留言,此外,还提供了简单的数据有效性验证功能。在“留言”界面中,设置了一个指向“留言”界面的超链接。,10.1.2 留言显示模块,留言存放在数据库中。分页显示数据库中的记
3、录,最简单的工具是DataGrid控件,但为了演示如何自由访问存储在内存中的记录,本例选择了Repeater控件作为显示工具。为了实现分页显示,在内存中建立一个临时数据表,根据当前页码和每页记录数,将需要显示在页面中的留言写入临时数据表,然后将Repeater控件绑定到该表以将表中记录显示到页面中,实现此功能的代码是本模块的核心部分。 与每页显示留言数列表框有关的程序操作,则是根据列表框中当前选择的条目,确定每页记录数目。 为了便于用户在不同的记录页间进行切换,本例提供了两种供用户选择页面的方法,一种是典型的首、尾、上、下页方式,另一种是由用户直接选择目的页码的方式。 根据以上分析可知,如果能
4、将显示任意页记录的代码写成一个过程,则其余的编程工作不过是根据用户操作,确定目的页码,然后再调用上述过程而已。,10.1.3 “留言”模块,“留言”模块主要包括供用户撰写、提交留言的前台输入界面和将留言信息写入数据库的后台代码组成。当用户留言被写入数据库后,本例采用了重新载入留言显示页面的处理方式。可以采用的另一方式是,显示一个包括提交成功的提示信息、指向留言显示和“留言”页面的超链接。为了保证用户提交信息的完整性和有效性,在供用户撰写、提交留言的前台输入界面中加入了验证控件,以保证用户必须输入其姓名和留言内容。,10.2 文件上传,在ASP网页中,如果想提供文件上传功能,必须使用专门的文件上
5、传组件。而ASP.NET内建了文件上传功能,可以十分方便地实现文件上传。 10.2.1 上传一个文件到服务器10.2.2 上传多个文件到服务器,10.2.1 上传一个文件到服务器,本例实现的功能是,提供可浏览文件的“浏览”按钮,供用户选择文件,在用户完成文件选择并单击“上传文件”按钮后,文件将被复制到服务器,之后,显示相关提示信息。本例的运行结果如图所示,请仔细阅读附加在源码后的注释内容。,10.2.2 上传多个文件到服务器,本例实现的功能是,提供多个可浏览文件的“浏览”按钮,供用户连续选择文件,在用户完成文件选择并单击“上传文件”按钮后,所选择的多个文件将被复制到服务器,之后,显示相关提示信
6、息。本例的运行结果如图所示,请仔细阅读附加在源码后的注释内容。,10.3 在线投票系统,10.3.1 在线投票系统简介10.3.2 投票模块10.3.3 得票模块,10.3.1 在线投票系统简介,本节实现的在线投票系统主要提供两个功能,一是允许用户进行投票,二是用户随时可查看提供当前投票结果清单。本节实现的在线投票系统由两个ASP.NET网页和一个Access数据库构成。其中网页用于提供投票和查看当前得票情况。而数据库中则包含两个数据表,一个数据表用于保存候选项及其所获选票的总数,另一个用于保存投票者的IP地址以及投票时间。在数据表中保存投票者的IP地址以及投票时间的目的是为了防止用户在短时间
7、内连续投票(即通常所谓的“灌水”)。本例防止“灌水”的策略是,当用户提交其选票后,系统将获取其IP地址,然后在数据表中查找该地址,如果已经存在,且来自该IP地址的最后一张选票发出时间不在10分钟以前,则拒绝接受选票。投票界面如图所示,该界面与文件Prac10-04-1.aspx对应,主要供用户投票,此外,也允许用户不投票而直接查看当前投票结果。,10.3.1 在线投票系统简介,投票结果清单如图所示,该界面与文件Prac10-04-2.aspx对应。为改善投票结果的显示效果,除了提供精确的统计数据外,还用直方图示意了得票情况。,10.3.2 投票模块,本模块的主要功能是获取用户的选票,然后根据防
8、“灌水”规则,确定选票是否有效,如果有效,则改写数据库中的相应候选项的得票总数,然后记录发出选票的IP地址以及发出时间;否则,提示用户不能重复投票。源码中需要注意的是:#06#20:定义Page_Load()过程。该过程的主要功能是,当网页不是因为客户端返回数据而加载时,从数据库中提取候选项,然后生成单选按钮组。#21、#52:定义Vote_Click()过程。当用户单击投票按钮后,本过程触发。#38:判断选票是否有效(如果数据库中没有当前选票的IP地址,程序为什么可以将选票视为有效?请读者自己考虑)。#53#55:定义View_Click()过程。该过程的功能是将浏览器重定向到网页Parc1
9、0-04-2.aspx。,10.3.3 得票模块,本模块的主要功能是从数据库中获取各候选项的得票情况,然后输出统计表和直方图。因为在显示统计结果时,需要用到一些未直接存储在数据库中的信息(如各选项的得票率),因此,将存储候选项的得票情况的表装入内存,然后在内存数据表中新增两个字段,一个是“得票率”,另一个是“直方图”。在直方图字段中,存储能够显示正确的横条图的HTML标记。,10.4 在线问卷调查系统,10.4.1 在线问卷调查系统简介10.4.2 选择、提交评价模块10.4.3 调查结果统计、显示模块,10.4.1 在线问卷调查系统简介,在线问卷调查与在线投票系统类似。不过,因为所调查的问题
10、有多个,因此代码略显复杂。下面是一个供用户对某讲义中的若干章进行评价的例子。如果不考虑代码可重用性的话,实现起来并不很麻烦,但如果需要改变调查内容和评语时,就必须改写源码。本例所实现的系统,可随意更改调查内容和数量以及评语内容。本例的运行结果如图所示。其中供用户选择、提交评价的页面与文件Prac10-05-1.aspx对应;调查结果统计页面与文件Prac10-05-2.aspx对应。,10.4.1 在线问卷调查系统简介,本例共使用了两个数据表,数据表的结构及内容如图所示。在本例子中,数据表option1中的d_Id字段在本例中没有用到。其余字段的意义可按照字面意义理解,但是需要注意的是,为了便
11、于编程,数据表option1中的d_opcount列的取值为Title表中记录得票数目的字段名,这样设置的目的,主要是为了便于构造根据用户所填的数据改写数据表内容的SQL语句。,10.4.2 选择、提交评价模块,本模块的主要功能是获取用户的评价,然后根据防“灌水”规则,确定用户提交的评价是否有效,如果有效,则改写数据库中的有关数据项,否则,提示用户不能再填表。与上节系统所实现的系统不同的是,本例是通过在Session变量中记录用户的填表情况以防止“灌水”的。即定义一Session变量,用于记录用户的填表情况。如果用户所提交的数据被写入数据库,则将该变量置为一特殊标记,当用户启动提交过程后,程序
12、将首先根据这个变量的值判断用户是否还有填表的权利,然后根据判断结果转入相应的处理。需要指出的是,这种防“灌水”的机制是十分脆弱的,因为用户在提交数据后,可以打开第二个浏览器提交数据。,10.4.3 调查结果统计、显示模块,本模块的主要功能是从数据库中获取各候选项的得票情况,然后输出统计表和直方图。因为在显示统计结果时,需要用到一些未直接存储在数据库中的信息(如各选项的得票率),因此,将存储候选项的得票情况的表装入内存,然后在内存数据表中新增两个字段,一个是“得票率”,另一个是“直方图”。,10.5 在线考试系统,10.5.1 在线考试系统简介10.5.2 考生登录模块10.5.3 试题生成与成
13、绩评定模块10.5.4 成绩显示模块,10.5.1 在线考试系统简介,本例实现的在线考试系统由考生登录模块、试题生成与成绩评定、成绩显示等模块构成。使用本系统之前,系统管理人员应将试题、答案和评分标准、考生的学号及姓名等存储在数据库中。使用本系统进行考试的考生,其操作流程如下:首先,进入登录页面,选择科目和学号。然后请求进入考场。如果系统允许该生进入考场,则浏览器将被重定向到答题页面;在答题页面中,考生可在线答题,答题完毕,单击交卷按钮,系统将可启动成绩评定过程,完成成绩评定后,浏览器将被自动重定向到成绩显示页面。上述过程如图所示。,10.5.1 在线考试系统简介,本系统一共使用了3个数据表,
14、其中的两个分别用于存储两份试题以及答案、评分标准等,另外一个则用于保存考生信息和考试成绩。下图给出了这两个数据表的结构和内容。本系统具有一定的智能,系统管理者可通过直接数据库来完成试题的增删和更改。,10.5.2 考生登录模块,本模块的主要功能是获取考生信息。考生在此界面中进行的操作相当于在普通考试中在试卷上填写姓名、学号的操作。为了避免防止考生重复答题,在本模块中加入了判断考生是否“尚未考试”的环节。此判断是基于“成绩单”中相应科目的成绩的,系统管理员在建立成绩表时,所有考生的所有科目成绩应设置为“尚未考试”。考生交卷后,系统将用考生成绩替代原来的“尚未考试”。最后,在重定向到答题页面时,本
15、模块还必须将考生学号、考试科目等信息一并传过去。这一任务是通过Url参数完成的。,10.5.3 试题生成与成绩评定模块,本模块的主要功能有二,一是根据所接收的考试科目信息,从数据库中获取试题并将其显示在页面上,构造便于考生操作的输入元素是该段代码中的重点内容;二是在考生交卷后,获取考生答题结果并与存储在数据库中的答案进行比对,确定成绩并将成绩写入数据库。在构造输入元素(单选、复选按钮)时,所采用的方法与上节在本质上是类似的。都是先在页面中放置一个Panel控件,然后向其中加入Literal、RadioButtonList或CheckBoxList控件。,10.5.4 成绩显示模块,相对于本系统
16、的其他模块而言,成绩显示模块是十分简单的。该模块接收来自试题生成与成绩评定模块的“学号”,从数据库中找到对应的记录,然后显示其姓名、科目和考试成绩等信息。,10.6 在线购物系统,10.6.1 在线购物系统简介10.6.2 购物区(商品类别)选择模块10.6.3 商品选择模块10.6.4 “购物袋”处理模块10.6.5 “退回所有商品”模块,10.6.1 在线购物系统简介,本例实现了一个能显示商品信息,并支持顾客自由选购的系统。该系统由4个ASP.NET网页和一个数据库组成,其主要用户界面如图所示。,10.6.1 在线购物系统简介,Ssyyrr5.mdb是一个Access数据库,用于存储商品信
17、息,共有两个数据表。数据表结构与内容如图所示。从设计的角度看,“购物袋”是本系统的核心。“购物袋”用于存储顾客所选择商品的“编号”和数量信息,顾客选择商品后,“购物袋”中的内容应能自动跟随顾客的选购操作,且不论用户位于那个页面,“购物袋”应时刻伴其左右。基于上述考虑,本系统利用Session变量和HashTable(Hash表)实现“购物袋”。HashTable是一种两列式的数据结构,其中一列称为Key,另一栏称为Value,其最大的特色是可以十分方便地通过Key获得Value。例如对于名为Hash的HashTable,如果其中一行数据的Key为“Book00”,则可以通过表达式Hash(Bo
18、ok00)访问该行数据的Value。,10.6.2 购物区(商品类别)选择模块,顾名思义,该模块的功能是支持顾客选择商品类别,以进入相应的“购物区”选购商品。本模块设计时考虑了两点,一是页面中的类别条目应来自数据库中的记录,这样才能在不更改页面文件的前提下随意更改、增删商品类别;二是通过Url参数将顾客所选择类别的编号传递给商品选择页面。,10.6.3 商品选择模块,本模块的主要功能是,接收商品类别参数,显示相应类别商品列表,并构造供顾客选择商品的输入元素,在顾客选购商品后,将所购商品信息记录在HashTable中或改写HashTable中原有的数据。在阅读实现本模块的源码时,应重点关注与Ha
19、shTable有关的操作。,10.6.4 “购物袋”处理模块,本模块的主要功能是,对DataGrid控件的有关属性进行设置,以显示“退回此商品”按钮;根据HashTable中的信息,从数据库中提取相应的商品记录,写入内存数据表,之后,增加数量和总价两个字段到内存数据表。将该表与DataGrid控件绑定并激活绑定以显示所购商品信息。在阅读实现本模块的源码时,应重点关注根据HashTable中有关数据构造查询条件的部分。,10.6.5 “退回所有商品”模块,与本模块对应的文件是Prac10-07-4.aspx,其中只包含在后台运行的代码。该模块的主要功能是清除HashTable中的所有记录。下面是实现本模块的源码。Prac10-07-4.aspxSub Page_Load(sender As Object, e As EventArgs)Dim Hash As HashTableIf Session(购物袋) Is Nothing Then Hash = New HashTableElseHash = Session(购物袋) End IfHash.Clear()Response.Redirect( Prac10-07-3.aspx ) End Sub,