2013-07-12 5 views
0

У меня есть страница «Survey», которая объявляется следующим образом:Передача данных на метод контроллера через POST

@using (Html.BeginForm("Survey", "Home", new { questionList = Model.Questions }, FormMethod.Post)) 
{ 
    <div class="survey"> 
     <ol class="questions"> 
      @foreach (Question q in Model.Questions) 
      { 
       <li class="question" id="@q.QuestionName"> 
        @q.QuestionText<br /> 
        @foreach (Answer a in q.Answers) 
        { 
         <input class="answer" id="@a.DisplayName" type="checkbox" /><label for="@a.DisplayName">@a.AnswerText</label> 
         if (a.Expandable) 
         { 
         <input type="text" id="@a.DisplayNameFreeEntry" maxlength="250" /> <span>(250 characters max)</span> 
         } 
         <br /> 
        } 
       </li> 
      } 
     </ol> 
    </div> 
    <div class="buttons"> 
     <input type="submit" value="Finish" /> 
    </div> 
} 

Когда я пошагового мой код, он попадает метод я установить до обработать их опрос:

[HttpPost] 
public ActionResult Survey(List<Question> questionList, FormCollection postData) 
{ 
    //Process Survey 
} 

Однако, когда я пошагово я нахожу, что переменная questionList является нулевым, а переменная postData не содержит каких-либо данных из формы. Попытка доступа к флажкам через Request[a.Displayname также не работает.

Все, что я прочитал, указывает, что это правильный способ сохранения значений из Модели в метод отправки и что я должен иметь доступ к FormCollection таким образом.

Что я делаю неправильно?

+0

Вы можете увидеть это http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx и это http://stackoverflow.com/questions/5496593/mvc- net-model-binding-to-array-on-fly/5499341 # 5499341 – Tassadaque

ответ

1

Вы должны сохранить questionList как скрытое поле на странице. Non-примитивные типы не получают сохранялось просто передавая их.

Один из способов сделать это

@Html.HiddenFor(m => m.Foo) 

Или вы могли бы сделать это прямо в HTML, как этот

<input type="hidden" name="Var" value="foo"> 

где m - ваша модель.

+0

Я довольно новичок в области отображения MVC. Как сохранить questionList как скрытое поле? – Jeff

0

Одна из проблем заключается в том, что ваш флажок и ваше текстовое поле не привязаны должным образом к вашей модели.

Вы должны использовать @Html.CheckBoxFor и @Html.TextBoxFor

1

Тот факт, что postData пуст странно, так как каждый входной элемент с идентификатором внутри тега формы должны быть переданы с запросом POST.

Но questionList не будет получен таким образом, так как его список сложного класса (а не только строки или int) и по умолчанию ModelBinder (то, что превращает переменные запроса HTTP в параметры, переданные в действие метод) не поддерживают списки сложных классов.

Если вы хотите получать список, вам необходимо будет реализовать свой собственный механизм привязки с CustomModelBinder.

This article может помочь вам реализовать его.

Смежные вопросы