ASP.Net MVC提交调查后的数据

时间:2010-09-10 04:50:50

标签: asp.net-mvc asp.net-mvc-2 forms postback survey

我很难确定如何在提交表单时从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 in其他文本框。当表单提交时,我看到formcollection [key =“1”]的值为5,我无法判断它是来自usertext还是引用MCOptionId的radioButton值。

有没有更好的方法来解决这个问题,db结构,视图呈现代码或表单控件的命名方式?也许表单集合不是可行的方式,但我很难过如何回发并使模型绑定工作。

感谢您提供任何帮助,为了看起来非常简单的事情,我一直在圈子里走来走去。

1 个答案:

答案 0 :(得分: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();