技术开发 频道

改卷的设计和实现(客观题自动打分)


【IT168技术文档】

  在线考试系统提供了老师在线批阅试卷的功能。并提供了客观题的自动改卷功能。下面介绍一般的改卷功能是如何实现的。首先还是要把学生的Paper显示给老师。但是老师想看到的试卷和学生看到的试卷肯定是不同的。学生的试卷是不会有标准答案的。老师的试卷为了简单只想显示每个题目的标准答案和学生的答案。我们知道学生的Paper显示是通过将Paper的XML格式转换成html来实现的。老师的当然也是了。用一个Paper显示给老师和学生的视图是不一样的。这也充分的体现了MVC架构在本系统中的应用。我们显示给老师的试卷用到的xslt文件是PaperForTeacher.xsl。显示给学生xslt文件是PaperForStudent.xsl。这样充分说明了应用XML+xslt给系统带来的灵活性。具体代码太长这里就不演示了。请参考源代码。

  下面介绍老师改卷功能中浏览器和服务器是如何交互。和在线考试模块一样。我们同样不想老师每改一题就重新为老师生成一次试卷。解决方案还是利用Ajax不过这次用的服务器端相应程序不再是Handler而是web服务。下面给出web服务PaperWebService.asmx的实现代码
namespace ExaminationSystem.WebService { [ScriptService] [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class PaperWebService : System.Web.Services.WebService { [WebMethod] public void SetScore(long questionId, int score) { Question question = new QuestionService().GetById(questionId); question.Score = score; question.IsScored = true; new QuestionService().Update(question); } } }
  该服务只有一个方法,方法接收Question对象的id号和得分。并通过QuestionService取得Question对象并设定得分然后将是否批改属性IsScored设为true。下面看看客户端是如何向服务器发送SetScore请求的。因为我们使用了Ajax.net框架所以客户端的Ajax类库可以很好的和服务器端的Web服务整合使用。ExaminationSystem.WebService.PaperWebService.SetScore(questionId,score,OnSucceeded,OnFailed,statusDiv);

  代码展示了客户端是如何调用服务器端的Web服务的。一行代码就是完成了一次异步请求并指定了成功调用后的回调函数OnSucceeded,调用失败后的回调函数OnFailed。statusDiv是一个div标签的引用,作为上下文对象提供给上面两个回调函数用于显示信息。因为每一个Question对象都会有一个用来打分的文本框和一个提交打分的按钮。下图是打分页面的显示效果。

  打分的同时还要验证打的分数是否合法。即必须小于分值。这就出现了一个很棘手的问题因为html都是通过xslt转换生成的。又不能将javascript写到xslt文件中。所以只能通过使用外部的js文件来为改卷html页面添加行为。这样符合web开发提倡的内容(html),样式(css),行为(javascript)三者之间的分离。但是如何在外部的js文件中操作html的dom对象呢?这里使用了叫Jquery的javascript类库。Jquery使用了类似css选择器的语法表达式来获取html中的Dom引用,并提供了链式表达式。使用起来非常方便。下面看看如何使用Jquery给页面上的每个打分按钮注册打分事件处理函数。
//绑定打分按钮事件处理函数 $(":button").click( function() { scoreTextBox=this.previousSibling ; statusDiv=this.nextSibling; questionId=scoreTextBox.id; scoreValue=scoreTextBox.scorevalue; score=scoreTextBox.value; if(score>scoreValue) { alert("得分不能超过分值!"); scoreTextBox.value=0; } else { ExaminationSystem.WebService.PaperWebService.SetScore( questionId,score,OnSucceeded,OnFailed,statusDiv); } } ); } function OnSucceeded(result,context,methodName) { alert("打分成功!"); $(context).text("已批改").css("color","green"); } function OnFailed(error,context,methodName) { alert("打分失败!"); }
0
相关文章