1. 程式人生 > >動態生成html表單並提交

動態生成html表單並提交

之前在做一個問卷調查的時候,用到了動態生成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                case1:
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                
case2:
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                case4:
20                    break;
21                case3:
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=server31    }
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判斷一下填寫情況。

=================下面是接收頁=====================


 1for (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":  //多選情況13char[] spl ='$' };
14                string selval = Request.Form[i].ToString();
15                string[] dx = selval.Split(spl);
16                //dx[0]是問題id,前面寫入了input的value中1718            case"rb":   //單選情況19string rbtmp = Request.Form[i].ToString();
20                char[] splrb ='$' };
21                string[] ans = rbtmp.Split(splrb);
22                //ans[0] ans[1] 我就不多說了,跟上面一樣23break;
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 中的內容了29break;
30        }
31    }

具體的邏輯關係判斷以及新增資料庫,我就不復述了,總體的思路就是這樣,根據資料庫動態生成的表單,post過來。

接收,因為寫入了字首,所以比較輕鬆的就獲取到了各種不同的表單的值。(因為我資料庫儲存的時候放在2個表中,填空放入單獨的表,單選和多選放在了一個表中,只存選項id和問題id)

在資料庫中儲存了填寫人的ip地址,限制了再次填寫的時間,在接收之前判斷了一下,這樣可以防止將表單另存為網頁之後刷表單行為。

第一次發原創的東西,大家見笑了。高手不要板磚伺候就好,大家多提意見。