2010-09-10 62 views
1

我很難搞清楚如何在提交表單時收集FormCollection中的數據,這些數據會收集調查答案。具體來說,我的問題是有多個選項的選項(單選按鈕)和其他文本框字段(如果選項不適用)。ASP.Net MVC提交調查問題數據

我的調查具有以下結構:

問題:[QuestionId,文本,QuestionType,OrderIndex]

MULTIPLE_CHOICE_OPTIONS:[MC_OptionId,QuestionId,OrderIndex,MC_Text]

答案:[AnswerId, QuestionId,MC_OptionId(可以爲空),UserTextAnswer]

QUESTION_TYPES是:[Multiple_Choice,Multiple_Choice_wOtherOption,FreeText的或複選框]

我的看法是呈現形式如下(僞代碼,以簡化):

//Html.BeginForm 
foreach(Question q in Model.Questions) 
{ 
    q.Text //display question text in html 

    if (q.QuestionType == Multiple_Choice) 
    { 
     foreach(MultipleChoice_Option mc in Model.MULTIPLE_CHOICE_OPTIONS(opt => opt.QuestionId == q.QuestionId) 
     { 
      <radio name=q.QuestionId value=mc.MC_OptionId /> 
      // All OK, can use the FormCollectionKey to get the 
      // QuestionId and its value to get the selected MCOptionId 
     } 
    } 
    else if (q.QuestionType == Multiple_Choice_wOtherOption) 
    { 
     foreach(MultipleChoice_Option mc in Model.MULTIPLE_CHOICE_OPTIONS(opt => opt.QuestionId == q.QuestionId) 
     { 
      <radio name=q.QuestionId value=mc.MC_OptionId /> 
     } 
     <textbox name=q.QuestionId /> 
     // ****Problem - I can get the QuestionId from the FormCollection Key, but 
     // I don't know if the value is from the user entered 
     // textbox or from a MCOptionId*** 
    } 
} 
<button type="submit">Submit Survey</button> 

    // Html.EndForm 

我這樣做,所以回到在處理後的控制器動作後,我可能讀了由鑰匙的FormCollection獲取questionId以及每個索引的值以獲取MCOptionID。 但在單選按鈕和文本框都帶有相同名稱鍵的問題的情況下,我將如何確定表單數據是來自單選按鈕還是文本框。

我可以看到我這樣做的方式因爲他們可能是一個問題(id = 1)具有MCOption w/Id = 5的情況,因此單選按鈕的值爲5,用戶輸入5在其他文本框中。當表單提交時,我看到formcollection [key =「1」]的值爲5,我無法確定它是來自usertext還是引用MCOptionId的radioButton值。

有沒有更好的方法來解決這個問題,無論是數據庫結構,視圖渲染代碼或窗體控件的命名方式?也許表單集合並不是我們要走的路,但我很難過如何回傳並使模型綁定起作用。

感謝您的任何幫助,一直圍繞着一些似乎很簡單的事情。

回答

1

考慮這個小重構......

//you're always rendering the radios, it seems? 
RenderPartial("MultipleChoice", Model.MULTIPLE_CHOICE_OPTIONS.Where(x => 
            x.QuestionId == q.QuestionId)); 

if (q.QuestionType == Multiple_Choice_wOtherOption) 
{ 
    <textbox name="Other|" + q.QuestionId />  
} 

和範圍內的強類型的局部視圖:

//Model is IEnumerable<MultipleChoice_Option > 
foreach (MultipleChoice_Option mc in Model) 
{ 
    <radio name=mc.Question.QuestionId value=mc.MC_OptionId />   
} 

看來你的問題是圍繞文本框的名稱;被ID綁定到問題上。在您的控制器中,您必須明確知道何時在文本框中查找任何值。

string userAnswer = Request.Form["OtherEntry|" + someQuestionID].ToString();