动态生成html表单并提交

xiaoxiao2021-02-28  9

之前在做一个问卷调查的时候,用到了动态生成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(02);  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地址,限制了再次填写的时间,在接收之前判断了一下,这样可以防止将表单另存为网页之后刷表单行为。

第一次发原创的东西,大家见笑了。高手不要板砖伺候就好,大家多提意见。

转载请注明原文地址: https://www.6miu.com/read-1900179.html

最新回复(0)