之前在做一个问卷调查的时候,用到了动态生成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地址,限制了再次填写的时间,在接收之前判断了一下,这样可以防止将表单另存为网页之后刷表单行为。
第一次发原创的东西,大家见笑了。高手不要板砖伺候就好,大家多提意见。