在去年这个时候有一个专业老师教我们asp.net,这个老师没有用课本ppt来教授,而是用一个考试系统为引子。一步一步的搭建这个系统,告诉我们软件工程,编程的思想和各种知识。
很到高大上,老师给我们演示,这个考试系统的自动抽题,自动判分。感觉可以收获很多很多,但是讲到添加用户这,这门课就结束了。还没有讲到题目的显示呢。
最近接到了一个思修问卷的项目,怎么做题目的显示呢?题目类型有三种,单选、多选、填空。当时感觉蒙蒙的,这个怎么做?后来看了看发布的系统和积分问卷的写法和数据库的数据。明白了大概的思路。
首先看一看关于题的数据库。
在来看一看,选项的id。
选项中的A,B,C在数据库中都已经添加好了,现在需要做的就显示到页面中。(每一道题要和对应的选项连接)
在d层中一个数据一个数据的连接,类型表连着问题表,问题表连着选项表。
List<examinationModel> examinationreally = new List<examinationModel>(); //题库包
var exam = (from qte in dbcontext.T_QuesType
join qun in dbcontext.T_Question on qte.quseTypeID equals qun.quseTypeID
join opn in dbcontext.T_Option on qun.quesID equals opn.quesID
select new examinationModel()
{
questype = qte.quesType, //问题类型
quesTypeID = qun.quseTypeID, //类型id
quesID = qun.quesID,
quesContent = qun.quesContent,
optionID = opn.optionID,
optionContent = opn.optionContent
}
);
因为在数据库中添加的时候,不能确定单选题,多选题,填空的顺序所以要在B层规划好顺序, B层怎么写的呢1?
到底所以的题的记录,然后在重新定义一个list,首先判断是否是单选,然后添加把所有的单选添加完在判断多选题,然后在全部添加多选,最后再添加填空。
//传递返回到con
QuestionDAL quDAL = new QuestionDAL();
List<examinationModel> bridge = new List<examinationModel>();//所有的
bridge = quDAL.getexamination();
List<examinationModel> bridgefirst = new List<examinationModel>();//所有的单选题
//这样的目的就是为了整个卷面都按照单选,多选,填空这个顺序走下来
for (int i = 0; i < bridge.Count; i++)
{
if (bridge[i].questype=="单选")
{
bridgefirst.Add(bridge[i]);
}
}
for (int i = 0; i < bridge.Count; i++)
{
if (bridge[i].questype == "多选")
{
bridgefirst.Add(bridge[i]);
}
}
for (int i = 0; i < bridge.Count; i++)
{
if (bridge[i].questype == "填空")
{
bridgefirst.Add(bridge[i]);
}
}
for (int i = 0; i < bridge.Count; i++)
{
if (bridge[i].questype != "填空" && bridge[i].questype != "多选" && bridge[i].questype != "单选")
{
bridgefirst.Add(bridge[i]);
}
}
return bridgefirst;
因为所有的选项都跟着向对应的问题,所以就有进行缩减,只有一个问题然后在跟多个选项。一个问题连着很多选项其中就是添加html代码进行简单的布局。把整个问卷化成一个字符串然后传到页面。
public ActionResult Index()
{
//页面初始化得到答题的页面
//建立一个新的数据包含问题
//建立一个新的数据包含选项
List<examinationModel> questionoption = new List<examinationModel>();
QuestionBLL queBLL = new QuestionBLL();
List<examinationModel> examinationreally = queBLL.getexamination();
string ok = ""; //各种的答案的字符连接
//string oksum = ""; //各种的答案的字符连接
if (examinationreally.Count==0)
{
ok = "<span>管理员正在配题</span>";
}
else
{
//现在的情况是记录表阶乘,先得到各个问题,在根据问题找选项
//所有数据大循环
//现在得到了所有的问题,唯一
questionsum = (from exam in examinationreally
group exam by exam.quesID into tt
select new examinationModel()
{
quesID = tt.Select(p => p.quesID).First(),
quesContent = tt.Select(y => y.quesContent).First(),
questype=tt.Select(p=>p.questype).First()
}).ToList();
for (int i = 0; i < questionsum.Count; i++) //某个具体的题的内容
{
int k= i + 1; //题号可以从1
ok += k + "、" + questionsum[i].quesContent;
ok += "<br><br>";
for (int j = 0; j < examinationreally.Count; j++)
{
if (questionsum[i].quesID==examinationreally[j].quesID)
{
//首先进行选择题的判断
if (questionsum[i].questype=="单选")
{
ok += "<input type=\"radio\" \" name=\"single" + k + "\" value=\"" + questionsum[i].quesID + "%" + examinationreally[j].optionID + "\" /> "; //问题id和答案id都有
ok += examinationreally[j].optionContent;
ok += "<br><br>";
}
//第二判断多选题
if (questionsum[i].questype=="多选")
{
ok += "<input type=\"checkbox\" \" name=\"checkbox" + k + "\" value=\"" + questionsum[i].quesID + "%" + examinationreally[j].optionID + "\" /> "; //问题id和答案id都有
ok += examinationreally[j].optionContent;
ok += "<br><br>";
}
//第三判断填空题
if (questionsum[i].questype=="填空")
{
ok += " <textarea rows='3' cols='20' maxlength='100' name=\"fill" + k + "\" style=\"width:600px;height:110px;\" /></textarea>";
ok += "<br>";
}
}
}
}
}
ViewBag.Message = ok;
return View("Question");
}
就是这种效果,谢谢大家的建议。