close

這個問題我以往不知道被多少人問過,寫下來以後被問直接來看這篇文章就好了.

首先情景是這樣的,後臺系統有個功能叫做問卷管理,而操作的方式就是新增一個問券,

最常看到的就是報名或是吃喜帖,就像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存進去.每次要用時拿出來轉.

當然你可以選擇使用一對無限大的資料庫設計,依照狀況選用吧.

arrow
arrow
    文章標籤
    MVC jquery
    全站熱搜

    baechang 發表在 痞客邦 留言(0) 人氣()