在这个基于ASP.NET+SQL SERVER2000的项目中,我们遇到了这样一个问题:有一个页面用来动态显示调查的所有题目(单选题,多选题,甚至有主观题),如何在页面提交后重新找到每个答题呢?参考了很多资料,能供参考的极少,不过我还是有了些思路:通过 Request.Form 来实现。
1。在生成题目(单选题,多选题,主观题)时,将动态生成的题目控件的Id(单选为RadioButtonList ,多选为CheckBoxList )与题目在数据库中的Id相绑定,保证控件能在页面提交后被识别,也方便与题目对应的。比如
//生成单选题
CheckBoxList checkBoxList1 = new CheckBoxList();
checkBoxList1 .ID = "ques" + quesData.QuestionId; //控件名,与比对答案时统一
//然后再把控件添加到容器中
panel1.Add(checkBoxList1 );
2。取出试题
//通过给控件Id赋予的唯一值,就可以在页面提交后重新找到这个控件
string ctrlName = "ques" + quesData.QuestionId;
if (Request.Form[ctrlName] != null)
{
iOption = int.Parse(Request.Form[ctrlName]);//取出单选的选项
........
}
//多选基本上和单选一样的,但有区别
string ctrlName, strOption;//控件名,选项
//需遍历每个答案, 从表单读取比对
int i;
bool isOK = true;
for(i=0; i<quesData.Options.Count; i++)
{
ctrlName = "ques" + quesData.QuestionId + ":" + i;
strOption = Request.Form[ctrlName];//取出i选项情况,是选中,还是没有选
//和数据库保存的答案相比较,如果i项该钩选,但考生没有选(返回空 或 不是ON),直接跳出
if ((bool)quesData.IsAnswer[i])
{
if (strOption == null || strOption.ToUpper() != "ON")
{
isOK = false;
break;
}
}
else
{
//不该钩选的答案选中了,直接跳出
if (strOption != null && strOption.ToUpper() == "ON")
{
isOK = false;
break;
}
}
}
return isOK ? quesData.Point : 0;
//////////////////////////////////////////////////////////////////////////////////
如此可见,不管页面上有多少试题,现在都能取出。以此可以延伸到在线考试的提交答卷情形中。