淺談如何構(gòu)建網(wǎng)上ASP.NET考試系統(tǒng)
一、ASP.NET考試系統(tǒng)數(shù)據(jù)庫(kù)的設(shè)計(jì):
建立數(shù)據(jù)庫(kù)netexam,在庫(kù)中添加考生信息表StuInfo,分別建立以下字段:考號(hào)ExamId(c)(主鍵)、考生姓名Name(c)、是否登錄考試LogYn(c)、得分Score(c)、隨機(jī)生成的試題答案mca(c)(注:此處以多選題為例,單選題、判斷題同理)。添加多選題題庫(kù)表mc,建立以下字段:題目question(c)、四個(gè)選choice1(c)、choice2(c)、choice3(c)、choice4(c)、答案answer(c)(注:多選題答案用0表示未選,1表示選擇,如選擇ABD就用1101表示)。
二、考生登錄:
在此處將考生信息插入表StuInfo,此處要防止考生重復(fù)登錄!給指定***的考號(hào),并將考號(hào)字段ExamId(c)設(shè)為主鍵,當(dāng)重復(fù)登錄時(shí),用Catch捕獲錯(cuò)誤,給出相應(yīng)提示,部分代碼如下(login.aspx):
- privatevoidButOk_Click(objectsender,System.EventArgse)
- {
- ...
- SqlConnectionStuConn=newSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;
- InitialCatalog=netexam");
- SqlCommandLoginCmd=StuConn.CreateCommand();//可根據(jù)不同情況選擇不同的數(shù)據(jù)庫(kù)連接
- ...
- LoginCmd.CommandText="InsertintoStuInfo(ExamId,Name)values('"+TxtId.Text.Trim()+"','"+TxtName.Text.Trim()+"')";
- //將考號(hào)、姓名插入相應(yīng)字段,其中TxtId,TxtName分別是輸入考號(hào)和姓名的文本框
- try
- {
- ...
- Session["Id"]=TxtId.Text.Trim();
- StuConn.Open();
- LoginCmd.ExecuteReader();
- Response.Redirect("test.aspx");
- }
- catch(Exception)//捕獲相應(yīng)錯(cuò)誤
- {
- Response.Write("<scriptlanguagescriptlanguage=\"javascript\">"+"\n");
- Response.Write("alert(\"不能重復(fù)登錄,或考號(hào)、姓名、密碼是否有誤!\")"+"\nscript>");
- }
- ...
- }
三、試題生成:
1、防止考生刷新頁(yè)面:
由于加載試題頁(yè)面時(shí)將從數(shù)據(jù)庫(kù)中隨機(jī)抽取試題,所以應(yīng)防止考生刷新面頁(yè)(刷新頁(yè)面會(huì)重新生成新的試題)。方法是將表StuInfo中的LogYn字段默認(rèn)值設(shè)為0,加載試題后設(shè)為1,交卷評(píng)分后設(shè)為2,加載試題頁(yè)面時(shí)進(jìn)行相應(yīng)檢查,以防止頁(yè)面的刷新,代碼如下(test.aspx):
- privatevoidPage_Load(objectsender,System.EventArgse)
- {
- if(!IsPostBack)
- {
- ...
- QuestCmd.CommandText="selectLogYnfromStuInfowhereExamId='"+Session["Id"].ToString()+"'";
- QuestConn.Open();
- SqlDataReaderQuestRd=QuestCmd.ExecuteReader();
- QuestRd.Read();
- if(QuestRd["LogYn"].ToString().Trim().Equals("1")||QuestRd["LogYn"].ToString().Trim().Equals("2"))
- //判斷是否已加載試題或是否已評(píng)分
- {
- ...
- Response.Write("<scriptlanguagescriptlanguage=\"javascript\">"+"\n");
- Response.Write("alert(\"不能刷新!請(qǐng)與管理員聯(lián)系,重新登錄。\")"+"\nscript>");
- ...
- }
- else
- {
- ...
- QuestCmd.CommandText="updateStuInfosetLogYn='1'";//已成功加載試題
- QuestCmd.ExecuteReader();
- ...
- }
- }
- ...
- }
2、隨機(jī)生成試題:
ASP.NET考試系統(tǒng)的關(guān)鍵是試題的隨機(jī)生成,即對(duì)于不同的計(jì)算機(jī)訪問(wèn)系統(tǒng)時(shí)將從題庫(kù)中隨機(jī)地抽取不同的試題。
在此我們可使用SQL語(yǔ)句"selecttopn*frommcorderbynewid()"從題庫(kù)中隨機(jī)抽取n條記錄,其中newid()生成uniqueidentifier值(若是ACCESS數(shù)據(jù)庫(kù)則用"selecttopn*frommcorderbyrnd(id)",其中id為自動(dòng)編號(hào)字段)。
在test.aspx頁(yè)面上放置一個(gè)Panel容器控件,以便動(dòng)態(tài)生成綁定到試題的控件,并將從表mc中隨機(jī)生成的試題答案寫入表StuInfo表中的mca字段,代碼如下(test.aspx):
- privatevoidPage_Load(objectsender,System.EventArgse)
- {
- if(!IsPostBack)
- {
- ...
- QuestCmd.CommandText="selecttop10*frommcorderbynewid()";//以隨機(jī)生成10道題為例
- QuestConn.Open();
- QuestRd=QuestCmd.ExecuteReader();
- while(QuestRd.Read())
- {
- LiteralLitTxt=newLiteral();
- LiteralLitBl=newLiteral();
- CheckBoxListChkMc=newCheckBoxList();
- ChkMc.ID="ChkMc"+i.ToString();
- LitTxt.Text=i.ToString()+"、"+Server.HtmlEncode(QuestRd["Question"].ToString())+"<BR><Blockquote>";
- LitBl.Text="";
- ChkMc.Font.Size=11;
- for(intj=1;j<=4;j++)
- {
- ChkMc.Items.Add(Server.HtmlEncode(QuestRd["Choice"+j.ToString()].ToString()));
- ChkMc.Items[j-1].Value=j.ToString();
- }
- mcStr+=QuestRd["Answer"].ToString().Trim();//mcStr是存儲(chǔ)隨機(jī)生成試題答案的字符串變量
- MyPanel.Controls.Add(LitTxt);
- MyPanel.Controls.Add(ChkMc);
- MyPanel.Controls.Add(LitBl);
- i++;
- }
- ...
- QuestCmd.CommandText="updateStuInfosetMca='"+mcStr+"'whereExamId='"+Session["Id"].ToString()+"'";//將隨機(jī)生成試題答案寫入數(shù)據(jù)表
- QuestConn.Open();
- QuestRd=QuestCmd.ExecuteReader();
- ...
- }
- ...
- }
四、交卷評(píng)分:
當(dāng)用戶點(diǎn)擊交卷按鈕后,應(yīng)將用戶的答題結(jié)果與試題答案進(jìn)行比對(duì),并給出相應(yīng)的分值寫入數(shù)據(jù)表,最后將表StuInfo中的LogYn字段設(shè)置為2,顯示考試得分,代碼如下(test.aspx):
- privatevoidButSend_Click(objectsender,System.EventArgse)
- {
- ...
- for(inti=1;i<=10;i++)//由于隨機(jī)生成了10道題,所以循環(huán)10次
- {
- for(intj=0;j<4;j++)
- if(Request.Form["ChkMc"+i.ToString()+":"+j.ToString()]!=null)
- mcs+="1";//mcs是存儲(chǔ)考生所選答案的字符串變量,已選用"1"表示,未選用"0"表示
- else
- mcs+="0";
- }
- ...
- QuestCmd.CommandText="selectmcafromStuInfowhereExamId='"+Session["Id"].ToString()+"'";
- QuestConn.Open();
- SqlDataReaderQuestRd=QuestCmd.ExecuteReader();
- QuestRd.Read();
- intStuScore=0;//存儲(chǔ)得分的變量
- for(i=0;i<10;i+=4)
- {
- if(QuestRd["mca"].ToString().Substring(i,4).Equals(mcs.Substring(i,4)))
- StuScore+=2;//從字段mca和mcs中每次取四個(gè)字符進(jìn)行比對(duì),如相等則加上2分
- }
- ...
- QuestCmd.CommandText="updateStuInfosetscore="+StuScore.ToString()+",LogYn='2'whereExamId='"+Session["Id"].ToString()+"'andLogYn='1'";//設(shè)置已評(píng)分標(biāo)志
- QuestRd=QuestCmd.ExecuteReader();
- ...
- Response.Redirect("score.aspx");//顯示考試得分頁(yè)面
- ...
- }
限于篇幅,在此只列出了實(shí)現(xiàn)網(wǎng)上ASP.NET考試系統(tǒng)的幾個(gè)要點(diǎn),讀者可根據(jù)自已的需要進(jìn)一步完善相應(yīng)的數(shù)據(jù)驗(yàn)證、后臺(tái)管理及界面設(shè)計(jì)。
【編輯推薦】