基于ASP.NET开发网上客观题测试系统
夏敏捷
(中原工学院计算机科学系 河南 郑州 450007)
摘要:本文说明ASP. NET与ASP的主要区别,介绍和图示ADO.NET对数据库操作的参考模型以及网上测试系统实现的主要技术,最后给出具体编程代码。
关键字:ASP.NET;NET框架;ADO.NET
一、ASP.NET技术
ASP.NET是微软推出的当前设计交互、动态网页的强有力工具,以前ASP也能实现。ASP使用Vbscript / Javascript这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象,这就明显产生以下几个问题:
1、代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
2、代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
3、弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
ASP.NET抛弃了VBSCRIPT和JSCRIPT,而使用.NET Framework所支持的VB.NET,C#等语言做为其开发语言,这些语言生成的网页在后台被转换成了类并编译成了一个DLL。由于ASP.NET是编译执行的,所以它比ASP拥有了更高的效率。当然,最合适的编程语言还是微软为.NET Framework专门推出的C# (读csharp),它可以看作是vc和java的混合体。它首先是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性,比如封装性、继承性、多态性等等,这就解决了刚才谈到的asp的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.NET上就可以使业务逻辑和html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;并且提供了完善的调试纠错体系。
二、ADO.NET参考模型
ASP.NET采用ADO.NET 提供的对 Microsoft SQL Server 等数据源以及通过 OLE DB 和 XML 公开的数据源的一致访问。应用程序可以使用 ADO.NET 来连接到这些数据源,并检索、操作和更新数据。
ADO.NET参考模型如图1:
图 1 A DO.NET参考模型
本测试系统采用ADO.NET来访问试题数据库,题型有单选题、多选题。后者与单选题类同,故本文主要说明单选题设计思想。
三、测试系统实现
本系统从单选题库中取出时试题。在对单选题处理上,每题四个选项使用四个单选按钮,其id不同,但通过Groupname相同可以将四个单选按钮归为一组。在显示题目时,采用DataGrid,Repeater都可以。本系统Repeater控件,通过ItemTemplate模板中定义四个单选按钮,来实现显示题目。
显示字段数据,采用<%# DataBinder.Eval(Container.DataItem," 字段名") %>形式,这是使用DataBind技术的一种标准格式。为Repeater控件设置数据源后,在使用采用DataBind技术,就可以将字段的值显示出来。在对多选题处理上,同样通过ItemTemplate模板来实现显示题目,每题四个选项使用四个复选框,每个复选框名称不一样。
当提交试卷时,通过Repeater.Items.Count可知记录数目, Repeater.Items[i].FindControl(单选按钮id)方法,可以得到每条记录的相应单选按钮,从而经判断Checked属性可知是否选择相应单选按钮。单选题测试运行结果如图2:
图2 单选题测试部分
单选题测试源程序文件:
<%@ Import Namespace="System.Data.OleDb" %>
<%@ Import Namespace="System.Data" %>
<HTML>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
if(!this.IsPostBack){
// 连接到sShops数据库
OleDbConnection cn=new OleDbConnection();
// 设置连接字符串,以便访问Microsoft Access的eShops.mdb数据库
cn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+
"Data Source="+Server.MapPath("test.mdb");
// 构造SQL语句,该语句用于从客户表中选出所有记录
String strSQL="select * from single2";
// 创建DataAdapter对象
OleDbDataAdapter da=new OleDbDataAdapter(strSQL,cn);
// 创建并填充Dataset
DataSet ds=new DataSet();
da.Fill(ds);
// 将Repeater控件绑定到DataSet
rpCust.DataSource=ds;
rpCust.DataBind();
cn.Close();
}
}
void n1_click(Object sender, EventArgs e)
{
OleDbConnection cn=new OleDbConnection();
cn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;"+"DataSource="+Server.MapPath("test.mdb");
cn.Open();
String strSQL="select * from single2";
OleDbCommand cm=new OleDbCommand(strSQL,cn);
OleDbDataReader dr=cm.ExecuteReader();
System.Web.UI.WebControls.RadioButton radiobutton;
string str="结果:";
for(int i=0;i<rpCust.Items.Count;i++)
{
dr.Read();
string control_name;
for(int j=1;j<=4;j++)
{ control_name="my";
control_name=control_name+j.ToString();
radiobutton=(RadioButton)rpCust.Items[i].FindControl(control_name);
if (radiobutton!=null && radiobutton.Checked)
{ char n=(char)(64+j);
str=str+(i+1).ToString()+n.ToString();
if(dr["答案"].ToString().Trim()==n.ToString())
str=str+" right ";
else
str=str+" error"+"/n";
}
}
}
label1.Text=str;
}
</script>
<body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0">
<form runat="server">
<asp:Repeater id="rpCust" runat="server">
<HeaderTemplate>
<Table width="80%" style="font: 8pt verdana">
<tr style="background-color:DFA894">单选题</tr>
</HeaderTemplate>
<ItemTemplate>
<tr style="background-color:FFECD8">
<td><%# DataBinder.Eval(Container.DataItem,"ID") %>
><%# DataBinder.Eval(Container.DataItem,"题目") %></td> </tr>
<tr style="background-color:FFECD8">
<td><asp:radiobutton id="my1" groupname="aa" runat="server" text="A."/>
<%# DataBinder.Eval(Container.DataItem, "选项A") %></td>
<td><asp:radiobutton id="my2" groupname="aa" runat="server" text="B."/>
<%# DataBinder.Eval(Container.DataItem, "选项B") %> </td> </tr>
<tr style="background-color:FFECD8">
<td><asp:radiobutton id="my3" groupname="aa" runat="server" text="C."/>
<%# DataBinder.Eval(Container.DataItem, "选项C") %> </td>
<td> <asp:radiobutton id="my4" groupname="aa" runat="server" text="D."/>
<%# DataBinder.Eval(Container.DataItem, "选项D") %></td></tr>
</ItemTemplate>
<FooterTemplate> </Table></FooterTemplate>
</asp:Repeater>
<asp:button id="Submit" Text="提交试卷" OnClick="n1_click" runat="server" />
<asp:label id="label1" text="label1" runat="server" />
</form> </body></HTML>
多选题测试时,显示时需将ItemTemplate模板中的radiobutton改为CheckBox,同时去掉groupname="aa"。结果判断时,void n1_click(Object sender, EventArgs e)中的
System.Web.UI.WebControls.RadioButton改为System.Web.UI.WebControls.CheckBox ;因为控件改为复选框。以下是主要不同部分:
System.Web.UI.WebControls.CheckBox CB;
for(int i=0;i<rpCust.Items.Count;i++)
{
dr.Read();
string d_result="";
Response.Write(i+1);
CB=(CheckBox)rpCust.Items[i].FindControl("my1");
if (CB!=null && CB.Checked) d_result=d_result+"A";
CB=(CheckBox)rpCust.Items[i].FindControl("my2");
if (CB!=null && CB.Checked) d_result=d_result+"B";
CB=(CheckBox)rpCust.Items[i].FindControl("my3");
if (CB!=null && CB.Checked) d_result=d_result+"C";
CB=(CheckBox)rpCust.Items[i].FindControl("my4");
if (CB!=null && CB.Checked) d_result=d_result+"D";
Response.Write("答案 is");
Response.Write(dr["答案"]);
if(dr["答案"].ToString()==d_result) Response.Write("right");
Response.Write("<BR>");
}
参考文献:
[1]木林森. C#和ASP.NET程序设计教程.北京;清华出版社,2002.1
[2]王易. ASP.NET网站设计实例通;清华出版社,2002.1