1

アンケートの回答を収集するフォームに送信されたときに、FormCollectionからデータを収集する方法を理解するのに苦労しています。特に私の問題は、オプションが適用されなかった場合に複数の選択肢(ラジオボタン)と他のテキストボックスフィールドがある質問にあります。

私の調査の構造は次のとおりです。

質問:[QuestionId、Text、QuestionType、OrderIndex]

MULTIPLE_CHOICE_OPTIONS:[MC_OptionId、QuestionId、OrderIndex、MC_Text]

回答:[AnswerId、QuestionId、MC_OptionId(nullの場合もあります)、UserTextAnswer]

QUESTION_TYPESは次のとおりです:[Multiple_Choice、Multiple_Choice_wOtherOption、FreeTextまたはCheckbox]

私の見解は、フォームを次のようにレンダリングしています(簡略化するための擬似コード):

//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値によるものなのかわかりません。

この問題に取り組むためのより良い方法はありますか?db構造、ビューレンダリングコード、またはフォームコントロールの名前の付け方です。フォームコレクションは行く方法ではないかもしれませんが、ポストバックしてモデルバインディングを機能させる方法に困惑しました。

助けてくれてありがとう、かなりシンプルに見える何かのために輪になって回っています。

4

1 に答える 1

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();
于 2010-09-10T05:03:15.767 に答える