之前在做一个问卷调查的时候,用到了动态生成html表单,个人感觉,html方式虽然原始,但它是万能的解决方法。
生成页查询数据库,然后得到泛型,用stringbuilder 生成html代码。
1 List<Model.Quest> wtlist = new BLL.Quest().GetListArray("dcid=" + dcid + "order by orderid asc");
2 System.Text.StringBuilder sb = new System.Text.StringBuilder();
3 sb.Append("<table width=\"100%\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\" bordercolor=\"#0099FF\">");
4 sb.Append("<input name=\"dcid\" type=\"hidden\" value=" + dcid + " />");
5 foreach (Model.Quest wt in wtlist)
6 {
7 switch (wt.qtype)
8 {
9 case 1:
10 sb.Append("<tr><td><div id=\"q" + wt.qid + "\" ><strong><span id=\"t" + wt.qid + "\">" + wt.qname + ": </span></strong>");
11 sb.Append("</td><td>");
12 sb.Append(retrbitem(wt.qid));
13 break;
14 case 2:
15 sb.Append("<tr><td><div id=\"q" + wt.qid + "\" ><strong><span id=\"t" + wt.qid + "\">" + wt.qname + ": </strong>\r");
16 sb.Append("</td><td>");
17 sb.Append(retmutitem(wt.qid));
18 break;
19 case 4:
20 break;
21 case 3:
22 sb.Append("<tr><td><div id=\"q" + wt.qid + "\" ><strong><span id=\"t" + wt.qid + "\">" + wt.qname + ":</span></strong>\r");
23 sb.Append("</td><td>");
24 sb.Append(rettk(wt.qid));
25 break;
26
27 }
28 }
29 sb.Append("</table>");
30 this.gx.InnerHtml = sb.ToString(); //前台有一个div runat=server
31 }
32
33 string retrbitem(int qid)//生成单选项的函数,其他我就不贴了
34 {
35 StringBuilder sb = new StringBuilder();
36 List<Model.SItem> rbl = new BLL.SItem().GetListArray("qid=" + qid);
37
38 foreach (Model.SItem rb in rbl)
39 {
40 sb.Append("<input type=\"radio\" name=\"rb" + qid + "\"");
41 sb.Append(" value=\"" + qid + "$" + rb.sid + "\"/>" + rb.sitem);
42 }
43 sb.Append("</td></tr>");
44 return sb.ToString();
45 }
前台的js 还没做到判断单选和多选,只能判断填空是否填写了,高手指点一下。
input中的value用$符号分割了问题的id和选项id,以便在接受页得到动态生成的问题id。
前台的页中指定post 的接收页
<form id="form1" action="r.aspx" method="post" >
<div runat="server" id="gx">
</div>
</form>
提交的button 我就不写了,在提交前用js判断一下填写情况。
=================下面是接收页=====================
1 for (int i = 0; i < Request.Form.Count; i++)
2 {
3 string tar = Request.Form.Keys[i].ToString().Substring(0, 2);
4 switch (tar)
5 {
6 case "dc":
7
8 dcid = Request.Form[i].ToString();
9 /*得到问卷的id ,在前面动态生成的表单中加了一个hidden的input
10 其他的操作细节我就不再演示了,我是写入数据库中。还加入了一些逻辑判断。*/
11 break;
12 case "dx": //多选情况
13 char[] spl = { '$' };
14 string selval = Request.Form[i].ToString();
15 string[] dx = selval.Split(spl);
16 //dx[0]是问题id,前面写入了input的value中
17
18 case "rb": //单选情况
19 string rbtmp = Request.Form[i].ToString();
20 char[] splrb = { '$' };
21 string[] ans = rbtmp.Split(splrb);
22 //ans[0] ans[1] 我就不多说了,跟上面一样
23 break;
24 case "tk":
25 char[] spltk = { '$' };
26 string tkval = Request.Form.Keys[i].ToString();
27 string[] tkt = tkval.Split(spltk);
28 //Request.Form[i].ToString() 就是post过来的input text 中的内容了
29 break;
30 }
31 }
具体的逻辑关系判断以及添加数据库,我就不复述了,总体的思路就是这样,根据数据库动态生成的表单,post过来。
接收,因为写入了前缀,所以比较轻松的就获取到了各种不同的表单的值。(因为我数据库存储的时候放在2个表中,填空放入单独的表,单选和多选放在了一个表中,只存选项id和问题id)
在数据库中存储了填写人的ip地址,限制了再次填写的时间,在接收之前判断了一下,这样可以防止将表单另存为网页之后刷表单行为。
第一次发原创的东西,大家见笑了。高手不要板砖伺候就好,大家多提意见。