在这个基于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;

//////////////////////////////////////////////////////////////////////////////////
如此可见,不管页面上有多少试题,现在都能取出。以此可以延伸到在线考试的提交答卷情形中。