這個問題我以往不知道被多少人問過,寫下來以後被問直接來看這篇文章就好了.
首先情景是這樣的,後臺系統有個功能叫做問卷管理,而操作的方式就是新增一個問券,
最常看到的就是報名或是吃喜帖,就像Google表單,然後新增很多題目,
所以會有N個題目,每個題目有M個選項,還有單選或是複選,或是輸入文字.
(我不列出詳細的程式碼,要自己去實做才可以真正體會)
當然會有一個Model 我們先叫做Questions.Model的內容很簡單var Options = List<string>以及Type,
每一個問題有多少選項,這個選項又適合種類別,單選或其他等等
在Views中使用Razor使用以下的方法
foreach var Q in Model_Q (這是題目迴圈)
foreach var Option in Q.Options (這是選項迴圈)
兩個迴圈要做數字累加以及Unique Name 準備給DOM做id
外層習慣叫i ,內層習慣叫j ;
所以就是 Q1. Q2. Q3,再依照Type來決定選項的呈現方式.
資料檢查時,假設是RadioGroup,可使用
1: if ($("input[name='Q1']").is(":checked") == false) {
2: Message("請填寫Q1答案。");
3: return false;
4: }
接著我們在$("#Submit1").click中先定義個陣列
Answers= [];
然後用以下方式來push到陣列裡
1: $.each($("input[name^='Q']"), function () {
2: Answers.push($(this).val());
3: });
至於如果有其他的像是CheckBox或是自己畫出來的選項,就必須改變檢查與抓值,
而如果Answers裡有其他更多的選項,可以用:
(這邊有一個注意點,就是單一個CheckBox沒選會是沒有值)
1: _Q = [];
2:
3: $.each($("input[name^='Q']"), function () {
4: _Q.push($(this).val());
5: });
6:
7: for (var i = 0; i < Count; i++)
8: {
9: Answewr.push(_Q[i]);
10: }
最後在ajax中用Json傳到後端,
1: $.ajax({
2: url: '@Url.Action("Action", "Controller")',
3: type: "POST",
4: data: { Answers: JSON.stringify(TradeData },
在Action使用Action(List<T> Answers),在這裡你必須定義一個Model跟前台相同,
然後使用Json轉Model的方式來轉換,
1: var AnswerList = JsonConvert.DeserializeObject<List<T>>(Answers);
資料庫的設計方法其實很簡單,準備一個varchar(max)把Json存進去.每次要用時拿出來轉.
當然你可以選擇使用一對無限大的資料庫設計,依照狀況選用吧.