アンケートの回答を収集するフォームに送信されたときに、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構造、ビューレンダリングコード、またはフォームコントロールの名前の付け方です。フォームコレクションは行く方法ではないかもしれませんが、ポストバックしてモデルバインディングを機能させる方法に困惑しました。
助けてくれてありがとう、かなりシンプルに見える何かのために輪になって回っています。