ASP.Net MVC Отправить данные для опроса - PullRequest
1 голос
/ 10 сентября 2010

Мне трудно понять, как собирать данные из коллекции FormCollection при отправке для моей формы, которая собирает ответы для опроса. В частности, моя проблема связана с вопросами с несколькими вариантами выбора (переключателями) и другим текстовым полем, если эти параметры не применяются.

Мой опрос имеет следующую структуру:

ВОПРОС: [QuestionId, Text, QuestionType, OrderIndex]

MULTIPLE_CHOICE_OPTIONS: [MC_OptionId, QuestionId, OrderIndex, MC_Text]

ОТВЕТ: [AnswerId, QuestionId, MC_OptionId (может быть нулевым), 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 или значения radioButton, ссылающегося на MCOptionId.

Есть ли лучший способ решения этой проблемы: структура базы данных, код визуализации представления или способ именования элементов управления формы? Возможно, сбор форм - это не тот путь, но я был озадачен тем, как отослать обратно и заставить работать привязку модели.

Спасибо за любую помощь, ходил по кругу за то, что кажется довольно простым.

1 Ответ

1 голос
/ 10 сентября 2010

Рассмотрим этот небольшой рефакторинг ...

//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();
...