我很难确定如何在提交表单时从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结构,视图呈现代码或表单控件的命名方式?也许表单集合不是可行的方式,但我很难过如何回发并使模型绑定工作。
感谢您提供任何帮助,为了看起来非常简单的事情,我一直在圈子里走来走去。
答案 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();